zoukankan      html  css  js  c++  java
  • 网络编程_UDP协议_聊天程序

    发送端:(将数据源改为键盘录入)

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDPSendDemo {
        public static void main(String[] args) throws IOException {
            
            System.out.println("发送端启动.......");
            
            //1.udp的socket服务,使用DatagramSocket对象
            DatagramSocket ds = new DatagramSocket();
            
            //2.将要发送的数据封装到数据包中
            //使用DatagramPacket将数据封装到该对象包中
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            
            String line = null;
            
            while((line = bufr.readLine())!=null){
                byte[] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);
                ds.send(dp);
                if("over".equals(line))
                    break;
            }
            
            ds.close();
            
        }
    
    }

     接收端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPReceiveDemo {
    
        public static void main(String[] args) throws IOException {
            
            System.out.println("接收端启动.......");
                //1.建立udp socket服务
            DatagramSocket ds = new DatagramSocket(10000);
            while(true){
                    //2.创建数据包
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    
                    //3.使用接收方法将数据存储在数据包中
                    ds.receive(dp);
                    
                    
                    //4.通过数据包对象的方法,解析其中的数据,比如:地址,端口,数据内容
                    String ip = dp.getAddress().getHostAddress();
                    int port = dp.getPort();
                    String text = new String(dp.getData(),0,dp.getLength());
                    
                    System.out.println(ip+":"+port+":"+text);
            }
            //5.关闭资源
            //ds.close();
        }
    
    }

    基于多线程的聊天程序:

    Send.java

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Send implements Runnable {
    
        private DatagramSocket ds;
        
        public Send(DatagramSocket ds){
            this.ds = ds;
        }
        
        @Override
        public void run() {
            
            try {
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                
                while((line=bufr.readLine())!=null){
                    
                    byte[] buf = line.getBytes();
                    DatagramPacket dp = 
                            new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);
                    ds.send(dp);
                    
                    if("886".equals(line))
                        break;
                }
                
                ds.close();
            } catch (Exception e) {
    
            }
        }
    
    }

    Rece.java

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class Rece implements Runnable {
    
        private DatagramSocket ds;
    
        public Rece(DatagramSocket ds) {
            this.ds = ds;
        }
    
        @Override
        public void run() {
            try {
                while (true) {
    
                    // 2,创建数据包。
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    
                    // 3,使用接收方法将数据存储到数据包中。
                    ds.receive(dp);// 阻塞式的。
    
                    // 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
                    String ip = dp.getAddress().getHostAddress();
                    int port = dp.getPort();
                    String text = new String(dp.getData(), 0, dp.getLength());
                    
                    System.out.println(ip + "::" + text);
                    if(text.equals("886")){
                        System.out.println(ip+"....退出聊天室");
                    }
    
                }
            } catch (Exception e) {
    
            }
    
        }
    
    }

    ChatDemo.java

    import java.io.IOException;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class ChatDemo {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
    
            
            DatagramSocket send = new DatagramSocket();
            
            DatagramSocket rece = new DatagramSocket(10001);
            new Thread(new Send(send)).start();
            new Thread(new Rece(rece)).start();
            
        }
    
    }
  • 相关阅读:
    Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程
    Python之路(第四十一篇)线程概念、线程背景、线程特点、threading模块、开启线程的方式
    Python之路(第四十篇)进程池
    Python之路(第三十九篇)管道、进程间数据共享Manager
    树莓派系列(第一篇):用python代码查看树莓派的温度、cpu使用率、内存占用情况
    Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
    Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程
    Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
    Python之路(第三十五篇) 并发编程:操作系统的发展史、操作系统的作用
    Netty入门(二)之PC聊天室
  • 原文地址:https://www.cnblogs.com/LO-ME/p/3606681.html
Copyright © 2011-2022 走看看