zoukankan      html  css  js  c++  java
  • 案例——UDP聊天

    UDP聊天案例

      做一个网络编程相关的案例,想着用利用UDP的快速且不用连接的优点做一个聊天室,我们一个聊天程序需要可以接收消息,也要可以发送消息,所以我们的DatagramSocket对象不但需要调用send函数,还需要调用recieve函数。
      而且由于聊天的特殊性,有可能在你发送的时候有消息需要接收,所以我们需要用到线程,开启两个线程,一个负责接收,一个负责发送,为了清晰起见,我们将收发消息各封装在两个实现了runnable接口的类中,然后重写run方法,内容就是消息的收或者发。
      在实现操作的时候,开启两个这样的程序,即可与自己聊天了(沙雕嗷~~),当然如果将IP最后一段改成广播形式,那这个局域网内的人都可以收到,即群聊。

    接收消息的类

    //接收任务
    class Receive implements Runnable{
    
        private DatagramSocket ds;		//私有成员是一个对象,由他调用recieve函数
    
        public Receive(DatagramSocket ds) {	//构造器
            super();
            this.ds = ds;
        }
    
    
        @Override
        public void run() {
    
            System.out.println("udp  接收端     run");
    
            while(true)
            {
                try {
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    ds.receive(dp);
    
                    String ip = dp.getAddress().getHostAddress();
                    int port = dp.getPort();
                    String text = new String(dp.getData(),0,dp.getLength());
    
                    System.out.println(ip+":"+port+":    "+text);
                    if(text.equals("886"))
                    {
                        System.out.println(ip+"...离开聊天室");
                    }
                } catch (Exception e) {
    
                }
    
            }
        }
    }
    

    发送消息的类

    //发送任务
    class Send implements Runnable{
    
        private DatagramSocket ds;
    
        public Send(DatagramSocket ds) {
            super();
            this.ds = ds;
        }
    
        @Override
        public void run() {
    
            System.out.println("udp  发送端     run");
    
            try {
                //将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
    
                while ((line = bufr.readLine()) != null)
                {
                    byte[] buf = line.getBytes(); //将数据转成字节数组
                    //将字节数组封装到数据包中
                    //如果IP改为121.255.255.255,最后一位是255,通知所有的主机
                    DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("121.255.255.21"), 10003);
                    ds.send(dp);
    
                    if("886".equals(line))
                        break;
                }
    
                ds.close();
            }catch(IOException e) {
    
            }
        }
    
    }
    

    主类

    public class UdpChatTest {
        /**
         * 案例一:通过udp实现群聊程序
         *
         *  思路:
         *  	这个程序既有收又有发,需要同时执行,需要多线程技术
         *  	一个线程复制发,一个线程负责收。需要两个任务
         * @throws IOException
         */
    
        public static void main(String[] args) throws IOException {
    
            //发送端的socket 接收端的socket
            DatagramSocket sendDs = new DatagramSocket();
            DatagramSocket ReceDs = new DatagramSocket(10006);
    
    		//创建两个任务对象
            Send send = new Send(sendDs);
            Receive rece = new Receive(ReceDs);
    		
    		//创建线程对象,并把任务对象传入
            Thread t1 = new Thread(send);
            Thread t2 = new Thread(rece);
    		
    		//开启线程
            t1.start();
            t2.start();
        }
    }
    
  • 相关阅读:
    前端导出excel文件
    promise和async/await的用法
    vue element 导出 分页数据的excel表格
    mac net.core 安装问题总结
    npm报MSBUILD错误的解决办法
    现大前端开发环境配置
    git 常用命令
    NodeJs (一)
    VUE 组件通信、传值
    vue-cli 第一章
  • 原文地址:https://www.cnblogs.com/vfdxvffd/p/11694232.html
Copyright © 2011-2022 走看看