新手网络编程之UDP实现聊天室

Posted awong18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手网络编程之UDP实现聊天室相关的知识,希望对你有一定的参考价值。

新手网络编程之UDP实现聊天室

上一篇文章我使用了TCP协议实现了一个非常非常简单的聊天,存在客户端和服务端,客户端和服务端必须要相互连接成功才能进行数据传输。(就像“打电话”,接通了才能互相收到语音);

而UDP协议就不同了,它不需要服务端,发出去的文件也不需要确定与对方是否连接成功!(就像发短信,时时刻刻都可以发,无论对方状态如何)。

简介

聊天室最重要的是能够相互发送消息,接收消息,这里就涉及到了多线程技术。

本例适合Java初学者练习参考使用,建议收藏,动手编写代码,体会每一行的作用。

源码

发送聊天信息类
package UDPchatEachOther;
?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
?
public class TalkSend implements Runnable {
?
   DatagramSocket socket =null;
   BufferedReader reader = null;
?
 private int fromPort;
   private String toIP;
   private int toPort;
?
   public TalkSend(int fromPort, String toIP, int toPort) throws Exception {
       this.fromPort = fromPort;
       this.toIP = toIP;
       this.toPort = toPort;
?
       try {
           //创建连接 并读取控制台数据
           socket=new DatagramSocket(fromPort);
           reader = new BufferedReader(new InputStreamReader(System.in));
      }catch (Exception e){
           e.printStackTrace();
      }
?
  }
   @Override
   public void run() {
?
       while (true) {
           String data = null;
           try {
               data = reader.readLine();   //获取控制台数据
               byte[] datas = data.getBytes();     //将获取到的数据转为byte
?
               DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));
?
               socket.send(packet);
               if(data.equals("bye")){
                   break;
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
?
      }
       socket.close();
  }
}
?
接收聊天信息类
package UDPchatEachOther;
?
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
?
public class TalkReceive implements Runnable {
?
   DatagramSocket socket =null;    //建立连接
   private int port;               //端口号
   private String msgFrom;         //发送方的名字
?
   public TalkReceive(int port,String msgFrom) {
       this.port = port;
       this.msgFrom=msgFrom;
       try{
           socket = new DatagramSocket(port);
      }catch (Exception e){
           e.printStackTrace();
      }
  }
?
   @Override
   public void run() {
?
       while (true) {
           try {
               //准备接受
               byte[] container = new byte[1024];
               DatagramPacket packet = new DatagramPacket(container, 0, container.length);
               socket.receive(packet);
?
               //将获取到的信息转化后输出
               byte[] data = packet.getData();
               String str = new String(data, 0, data.length);
               System.out.println(msgFrom+":"+str);
?
               //断开连接 bye
               if(str.equals("bye")){
                   break;
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
?
?
      }
       socket.close();
  }
}
?
用户一
package UDPchatEachOther;
?
public class user1 {
   public static void main(String[] args) throws Exception {
       new Thread(new TalkSend(7777,"localhost",9999)).start();
       new Thread(new TalkReceive(8888,"user2")).start();
  }
}
?
用户二
package UDPchatEachOther;
?
public class user2 {
   public static void main(String[] args) throws Exception {
       new Thread(new TalkSend(5555,"localhost",8888)).start();
       new Thread(new TalkReceive(9999,"user1")).start();
  }
}
?

 

以上是关于新手网络编程之UDP实现聊天室的主要内容,如果未能解决你的问题,请参考以下文章

Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)

Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)

java基础——UDP实现dos聊天室案例

在Android中使用UDP和MQTT协议编写聊天编程

python 入门 socket 实现udp聊天室

socket发送UDP广播实现聊天室功能