• 新手网络编程之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();
      }
    }

     

  • 相关阅读:
    日期计算
    普通二叉树转换成搜索二叉树
    每周行情
    virtualbox安装增强功能时【未能加载虚拟光盘】
    linux实用命令之如何移动文件夹及文件下所有文件
    Linux文件夹文件创建、删除
    php 克隆 clone
    function_exists (),method_exists()与is_callable()的区别
    webgrind安装使用详细说明
    windows下redis的安装配置和php扩展使用phpredis
  • 原文地址:https://www.cnblogs.com/awong18/p/13121939.html
Copyright © 2020-2023  润新知