zoukankan      html  css  js  c++  java
  • 026.2 网络编程 UDP聊天

    实现,通过socket对象

    ##############################################################
    需求建立UDP发送端:
    ###思路:
    1、建立可以实现UDP传输的socket服务
    2、明确具体发送的数据
    3、通过socket服务将数据发送出去
    4、关闭服务

    ###步骤:
    1、创建DatagramSocket对象
    2、创建DatagramPacket对象,注意参数,(数组,数组长度,通过InetAddress.getByName("127.0.0.1")方式输入ip,端口)
    3、通过DatagramSocket对象的send发送DatagramPacket对象
    4、关闭DatagramSocket对象


    //###发送端代码:

    System.out.println("UDP发送端启动");
    //1、创建UDP服务
    DatagramSocket ds = new DatagramSocket();
    
    //2、明确数据
    String str = "miss";
    
    //3、发送数据,将数据封装到数据包中
    //3.1封装,明确目的和端口
    byte[] buf = str.getBytes();
    DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);
    //3.2发送
    ds.send(dp);
    
    ds.close();

    ##################################################################
    接收端
    ###思路:
    1、创建socket服务,明确端口
    2、收数据
    3、将其中需要的数据取出来,ip,端口,data
    4、关闭资源

    ###步骤:
    1、创建DatagramSocket对象
    2、创建DatagramPacket对象,参数需要一个字节数组及长度
    3、通过DatagramSocket对象的receive方法接收发送端发送的信息,参数填DatagramPacket对象
    4、使用DatagramPacket对象的dp.getAddress().getHostAddress()方法获取IP,getPort方法获取端口
           dp.getData(),dp.getLength(),获取数据和长度
    5、关闭DatagramSocket对象

    //###接收端代码

    System.out.println("UDP接收端启动");
    //1、创建socket服务
    DatagramSocket ds = new DatagramSocket(10000);
    
    //2、使用socket的接收方法,接收数据,将接收到的数据存储到数据包中,通过数据包的方法解析
    //2.1创建数据包
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    ds.receive(dp);
    //2.2 通过数据包对象对数据解析
    String ip = dp.getAddress().getHostAddress();
    int port = dp.getPort();
    
    //获取文字数据
    String str = new String(dp.getData(),0,dp.getLength());
    System.out.println(ip+"-"+port+":"+str);
    
    //关闭资源
    ds.close();

    以上实现的是单发单收,不符合现实,所以要运用多线程实现多发多收
    ######################################################################################
    以下代码,自己读一下,与多线程和流组合使用
    UDP聊天多发多收代码:
    #######main.java

    public class UDPChatTest {
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
            /*
             * 案例一:通过udp实现群聊程序。 思路: 这个程序中既有收又有发,需要同时执行,需要使用多线程技术。
             * 一个线程负责发,一个线程负责收。需要两个任务。
             */
            //发送端的socket 接收端的socket
            DatagramSocket sendSocket = new DatagramSocket(55555);
            DatagramSocket receSocket = new DatagramSocket(10002);
            
            //创建任务对象。
            Send send = new Send(sendSocket);
            Rece rece = new Rece(receSocket);
            
            //创建线程并开启。
            Thread t1 = new Thread(send);
            Thread t2 = new Thread(rece);
            t1.start();
            t2.start();
        }
    }

    // 发送任务

    class Send implements Runnable {
        private DatagramSocket ds;
        public Send(DatagramSocket ds) {
            super();
            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.223"), 10002);    //IP为255表示广播
                    ds.send(dp);
                    if ("886".equals(line)) {
                        break;
                    }
                }
    
                // 4,关闭资源。
                ds.close();
            } catch (IOException e) {
    
            }
        }
    }

    // 接收任务。

    class Rece implements Runnable {
        private DatagramSocket ds;
        public Rece(DatagramSocket ds) {
            super();
            this.ds = ds;
        }
        @Override
        public void 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 (IOException e) {
                }
            }
        }
    }
  • 相关阅读:
    HTML5入门5---HTML5控件元素
    HTML5入门4---HTML5 与 HTML4 同一网页的不同写法
    HTML5入门3---视频播放器
    HTML5入门2---js获取HTML元素的值
    JTable指定单元格加控件
    JTable单元格放自定义控件(一)-如何在JTable的单元格放JPanel
    数据库外键的使用
    LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    mvn 安装ojdbc6.jar
    Apache 下SVN项目管理使用说明
  • 原文地址:https://www.cnblogs.com/-nbloser/p/9689476.html
Copyright © 2011-2022 走看看