zoukankan      html  css  js  c++  java
  • 新手网络编程之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();
      }
    }

     

  • 相关阅读:
    java实现 n人过桥问题
    git:rebase的原理
    注解@ConfigurationProperties使用方法
    docker+mysql 更改配置后重启不了的解决方案
    docker+mysql 构建数据库的主从复制
    Linux 踩坑记
    OSS上传图片无法在线预览的解决方案
    Linux中du、df显示不一致问题
    zookeeper作配置中心(存储支付信息)
    @Configuration结合@Bean实现对象的配置
  • 原文地址:https://www.cnblogs.com/awong18/p/13121939.html
Copyright © 2011-2022 走看看