黑马程序员之UDP

时间:2023-02-21 14:29:41

------- android培训java培训、期待与您交流! ----------

/**
 * 编写一个聊天程序
 * 有收数据的部分,和发数据的部分
 * 两个部分需要同时执行
 * 那就需要用到多线程技术
 * 一个线程控制收,一个线程控制发
 *
 * 因为收和发是不一致的,所以要定义两个run方法
 * 而且这两个方法要封装到两个不同的类中
 *
 */

//发送端
class Send implements Runnable{

//用来发送和接收数据报包的套接字
 private DatagramSocket ds;
 public Send(DatagramSocket ds){
  this.ds=ds;
 }
 public void run(){

//获取键盘录入
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  String line = null;
  try {

   //判断读取的内容
   while((line=bufr.readLine())!=null){
    if("886".equals(line)){
     break;
    }

    //把数据封装到数据报包当中,用来将长度为 length 的包发送到指定主机上的指定端口号
    byte[] buf = line.getBytes();
    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10002);

    //利用DatagramSocket对象发送数据
    ds.send(dp);
   }
  } catch (UnknownHostException e) {
   System.out.println("主机异常");
  } catch (IOException e) {
   System.out.println("IO异常");
  }
 }
}

//接收端

class Receive implements Runnable{

//用来发送和接收数据报包的套接字
 private DatagramSocket ds;
 public Receive(DatagramSocket ds){
  this.ds=ds;
 }
 public void run(){
  try {

   //接收端一直保持接收状态
   while(true){
    byte[] buf = new byte[1024];

    //接收端的数据报包不用指定主机和端口
    DatagramPacket dp = new DatagramPacket(buf,buf.length);
    //接收数据报包    

    ds.receive(dp);
    //获取数据报包中的信息
    String ip = dp.getAddress().getHostAddress();
    String data = new String(dp.getData(),0,dp.getLength());
    System.out.println(ip+":"+data);
   }
  } catch (IOException e) {
    System.out.println("接收端失败");
  }
 } 
}
public class ChatDemo {

 public static void main(String[] args) throws Exception {
  //建立发送端socket对象

  DatagramSocket sendSocket = new DatagramSocket();

  //建立接收端socket对象,接收端监听的接口必须和发送端数据包指定的端口一致
  DatagramSocket receiveSocket = new DatagramSocket(10002);
  //发送端线程,通过Send的构造函数,初始化发送端socket对象

  new Thread(new Send(sendSocket)).start();

  //接收端线程
  new Thread(new Receive(receiveSocket)).start();
  

 }

}