zoukankan      html  css  js  c++  java
  • java基础知识回顾之java Socket学习(一)--UDP协议编程

    UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地。不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点。就像寄信,写好信放到邮箱桶里面,既不能保证信件在邮递过程中不丢失,也不能保证信件是按顺序寄到目的地的。

    看java API用到java.net.DatagramSocketjava.net.DatagramPacket类:

    DatagramSocket此类表示用来发送和接收数据报包的套接字(IP地址和端口号)。

    DatagramPacket数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

    下面看一个简单的接收端和服务端的代码:

    接收端代码:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPReceDemo {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
    
            System.out.println("接收端启动......");
            /*
             * 建立UDP接收端的思路。
             * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
             * 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
             * 3,使用socket服务的receive方法将接收的数据存储到数据包中。
             * 4,通过数据包的方法解析数据包中的数据。
             * 5,关闭资源 
             */
            
            //1,建立udp socket服务。
            DatagramSocket ds = new DatagramSocket(10000);//接受端应用程序的端口号
            
            
            //2,创建数据包,用来接收长度为length的数据包
            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(); 
        }
    }

    发送端代码:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDPSendDemo {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
    
            System.out.println("发送端启动......");
            /*
             * 创建UDP传输的发送端。
             * 思路:
             * 1,建立udp的socket服务。
             * 2,将要发送的数据封装到数据报包中。 
             * 3,通过udp的socket服务将数据包发送出去。
             * 4,关闭socket服务。
             */
            //1,udpsocket服务。使用DatagramSocket对象。
            DatagramSocket ds = new DatagramSocket();
            
            //2,将要发送的数据封装到数据包中。
            String str = "udp传输。。。。。。。。。。。。";
            //使用DatagramPacket将数据封装到的该对象包中。
            byte[] buf = str.getBytes();
            //DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 
            DatagramPacket dp = 
                    new DatagramPacket(buf,buf.length,InetAddress.getByName("QT-201216220606"),10000);
            //3,通过up的socket服务将数据报发送出去。使用send方法。
            ds.send(dp);
            
            //4,关闭资源。
            ds.close();
        }
    
    }

    接收端启动,然后发送端启动,结果发送端向接收端主机发送了:192.168.0.101:4882:udp传输。。。。。。。。。。。。内容。

    其它不变,发送端的代码改变,变为可以实现键盘的输入(UDP协议):

    package cn.itcast.net.p2.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 UDPSendDemo2 {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
    
            System.out.println("发送端启动......");
            /*
             * 创建UDP传输的发送端。
             * 思路:
             * 1,建立udp的socket服务。
             * 2,将要发送的数据封装到数据包中。 
             * 3,通过udp的socket服务将数据包发送出去。
             * 4,关闭socket服务。
             */
            //1,udpsocket服务。使用DatagramSocket对象。
            DatagramSocket ds = new DatagramSocket();
            //键盘输入的内容发送给客户端,使用字节向字符转化的流
            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.0.101"),10000);
                ds.send(dp);
                
                if("over".equals(line))
                    break;
            }
            
            //4,关闭资源。
            ds.close();
        }
    }

    启动接收端,启动服务端,在服务端输入,在接收端收到信息。。。。。。。

    简单的多人聊天室实现:使用多线程,IO:

    接收端:

    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("over")){
                        System.out.println(ip+"....退出聊天室");
                    }
    
                }
            } catch (Exception e) {
    
            }
    
        }
    
    }

    服务端:

    package cn.itcast.net.p3.chat;
    
    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();
                    //表示把信息发送到192.168.0所有的IP地址上面,发送了一个广播IP地址最后一位1-254的所有主机都能收到
                    DatagramPacket dp = 
                            new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.255"),10001);
                    ds.send(dp);
                    
                    if("886".equals(line))
                        break;
                }
                
                ds.close();
            } catch (Exception e) {
            }
        }
    
    }

    启动程序:

    import java.io.IOException;
    import java.net.DatagramSocket;
    
    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();
            
        }
    
    }
     
  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/200911/p/3930371.html
Copyright © 2011-2022 走看看