Java模拟UDP通信示例代码
Java基础:模拟UDP通信
1、一次发送,一次接收
1.1、发送方
//发送端,不需要连接服务器
publicclassUdpClientDemo{
  publicstaticvoidmain(String[]args)throwsException{
    //1.发送数据包需要一个Socket
    DatagramSocketsocket=newDatagramSocket();
    //1.2建立一个包
    Stringmsg="你好";
    InetAddresslocalhost=InetAddress.getByName("localhost");
    System.out.println(localhost);
    intport=8080;
    /*
		通过UDP发送消息,需要通过包来发送,-->DatagramPacket(),该方法有多种重载形式,以下使用参数列表最多的那个
		参数:
		-要发送的消息的字节数组 
		-从字节数组的哪个位置开始发送
		-发送的长度
		-对方的IP地址
		-对方的端口号
     */
    DatagramPacketpacket=newDatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
    //2.发送数据包
    socket.send(packet);
    socket.close();
  }
}
1.2、接收方
//接收端,接收端需要保证存在,否则接收不到,所以需要提前开启
publicclassUdpServerDemo{
  publicstaticvoidmain(String[]args)throwsException{
    //1.接收也需要一个Socket,并且要开启接收的端口
    DatagramSocketsocket=newDatagramSocket(8080);
    //需要一个字节数组来接收数据
    byte[]buffer=newbyte[1024];
    //1.2封装数据包
    DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
    //2.接收数据,阻塞式接收:一直处于监听状态
    socket.receive(packet);
    //关闭套接字
    socket.close();
    //输出一下
    System.out.println(packet.getAddress().getHostAddress());
    //trim():为了去除多余的空格
    System.out.println(newString(packet.getData()).trim());
  }
}
2、多次发送,多次接收
一方多次发送,一方多次接收,加上一个while(true){}死循环,并规定在什么情况下退出即可。
2.1、发送方
publicclassChatSenderDemo{
  publicstaticvoidmain(String[]args)throwsException{
    //使用Socket来接收
    DatagramSocketsocket=newDatagramSocket();
    while(true){
      //准备发送包裹,从键盘接收数据
      BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));
      //读取一行
      Stringdata=reader.readLine();
      byte[]dataBytes=data.getBytes();
      DatagramPacketpacket=newDatagramPacket(dataBytes,dataBytes.length,newInetSocketAddress("127.0.0.1",6666));
      //发送
      socket.send(packet);
      //什么时候退出
      if("bye".equals(data)){
        break;
      }
    }
    //关闭
    socket.close();
  }
}
2.2、接收方
publicclassChatReceiveDemo{
  publicstaticvoidmain(String[]args)throwsException{
    DatagramSocketsocket=newDatagramSocket(6666);
    while(true){
      //准备接收数据包裹
      byte[]buffer=newbyte[1024];
      //用来接收数据
      DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
      //接收包裹,阻塞时接收
      socket.receive(packet);
      //接收到的数据
      StringreceiveData=newString(packet.getData()).trim();
      //打印到控制台
      System.out.println(receiveData);
      //什么时候退出
      if("bye".equals(receiveData)){
        break;
      }
    }
    //关闭
    socket.close();
  }
}
3、模拟双方通信
模拟双方使用UDP通信,需要开启两个线程,并对以上代码进行【共性提取】,进一步进行抽象。
由此,双方可以通过指定的端口来互相发送消息。
3.1、发送方的线程
//开启多线程需要实现Runnable接口,实现run()方法
publicclassTalkSenderimplementsRunnable{
  //网络套接字,发送需要
  DatagramSocketsocket=null;
  //缓冲读取流
  BufferedReaderreader=null;
  //开启哪个端口接收
  privateintfromPort;
  //对方的IP
  privateStringtoIP;
  //对方的端口
  privateinttoPort;
  //通过构造方法进行初始化
  publicTalkSender(intfromPort,StringtoIP,inttoPort){
    this.fromPort=fromPort;
    this.toIP=toIP;
    this.toPort=toPort;
    try{
      socket=newDatagramSocket(fromPort);
    }catch(SocketExceptione){
      e.printStackTrace();
    }
  }
  //重写run()方法,设置线程任务
  @Override
  publicvoidrun(){
    while(true){
      Stringdata=null;
      try{
        //准备发送包裹,从键盘接收数据
        reader=newBufferedReader(newInputStreamReader(System.in));
        //读取一行
        data=reader.readLine();
        byte[]dataBytes=data.getBytes();
        DatagramPacketpacket=newDatagramPacket(dataBytes,dataBytes.length,newInetSocketAddress(toIP,toPort));
        socket.send(packet);
      }catch(IOExceptione){
        e.printStackTrace();
      }
      //什么时候退出
      if("bye".equals(data)){
        break;
      }
    }
    //关闭
    socket.close();
  }
}
3.2、接收方的线程
publicclassTalkReveicerimplementsRunnable{
  DatagramSocketsocket=null;
  //从哪个端口接收
  privateintformPort;
  //发送方是谁
  privateStringwho;
  publicTalkReveicer(intformPort,Stringwho){
    this.formPort=formPort;
    this.who=who;
    try{
      socket=newDatagramSocket(formPort);
    }catch(SocketExceptione){
      e.printStackTrace();
    }
  }
  @Override
  publicvoidrun(){
    while(true){
      StringreceiveData=null;
      try{
        //准备接收数据包裹
        byte[]buffer=newbyte[1024];
        //接收数据
        DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
        //接收数据,阻塞式
        socket.receive(packet);
        //接收到的数据
        receiveData=newString(packet.getData());
        System.out.println(who+":"+receiveData.trim());
      }catch(IOExceptione){
        e.printStackTrace();
      }
      //什么时候退出
      if("bye".equals(receiveData)){
        break;
      }
    }
    //关闭
    socket.close();
  }
}
3.3、模拟学生
//学生端
publicclassTalkStudent{
  publicstaticvoidmain(String[]args){
    //开启5555端口,发送到本机的6666端口
    newThread(newTalkSender(5555,"localhost",6666)).start();
    //规定使用7777端口接收老师发送的消息
    newThread(newTalkReveicer(7777,"老师")).start();
  }
}
3.4、模拟老师
//教师端
publicclassTalkTeacher{
  publicstaticvoidmain(String[]args){
    //开启8888端口,发送到本机的7777端口
    newThread(newTalkSender(8888,"localhost",7777)).start();
    //规定使用6666端口接收学生发送的消息
    newThread(newTalkReveicer(6666,"学生")).start();
  }
}
总结:
使用UDP通信,其实主要的步骤分为三步:
1 用DatagramSocket()来开启端口,通过开启端口聊天。
2 用DatagramPacket()来发送或者接收数据。
3 关闭DatagramSocket,释放资源。
以上就是Java模拟UDP通信示例代码的详细内容,更多关于Java模拟UDP通信的资料请关注毛票票其它相关文章!
