码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-13 23:01:40      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:plain   简介   operator   equals   信息   多线程   variable   断开连接   send   

新手网络编程之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实现聊天室

标签:plain   简介   operator   equals   信息   多线程   variable   断开连接   send   

原文地址:https://www.cnblogs.com/awong18/p/13121939.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!