• Day 21:网络编程(2)


    以课程中feiQ为例,feiQ作为一个典型的网络编程应用,用一段代码尝试给自己的发送消息

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Demo1 {
    
        public static void main(String[] args) throws IOException {
            // 建立udp的服务
            DatagramSocket socket = new DatagramSocket();
            // 准备数据,把数据封装到数据包中
            String data = "feiQ你好!";
            DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("192.168.1.101"), 2425);
            // 发送数据
            socket.send(packet);
            // 关闭资源
            socket.close();
        }
    }

    此代码在执行的时候是是失败的,在网络编程(1)中,运行的接收和发送方是成功的,为什么这里就不可以了呢?

    原因: 每个网络程序都有自己所处理的特定格式数据,如果接收到的数据不符合指定的格式,那么就会被当成垃圾数据丢弃。(加密)

    feiQ是局域网程序,所以可以随便尝试,QQ作为面向大众,尝试的话就会犯罪~hiahiahia~~不要玩火哟!

    解决方法:

      飞Q接收的数据格式:
       version:time :sender : ip: flag:content ;
       版本号:时间:发送人 :IP:发送的标识符(32): 真正的内容;

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Demo1 {
    
        public static void main(String[] args) throws IOException {
            // 建立udp的服务
            DatagramSocket socket = new DatagramSocket();
            // 准备数据,把数据封装到数据包中
            String data = getData("feiQ你好!");
            DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("192.168.15.255"), 2425);
            // 发送数据
            socket.send(packet);
            // 关闭资源
            socket.close();
        }
        // 把数据拼接成指定格式的数据
        public static String getData(String content) {
            StringBuilder sb = new StringBuilder();
            sb.append("1.0:");
            sb.append(System.currentTimeMillis() + ":");
            sb.append("小号:");
            sb.append("192.168.10.1:");
            sb.append("32:");
            sb.append(content);
            return sb.toString();
        }
    }

    解决群发(一对多)问题只需修改为广播地址

    在udp协议中,有一个IP地址称作为广播地址,广播地址就是主机号为255地址。给广播IP地址发送消息的时候,在同一个网络段的机器都可以接收 到信息。(192.168.15.255)

    给send方法加一个死循环会特别嗨哟

    群聊(多对多):同时要发送和接收(多线程)

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    //发送
    public class Demo3 extends Thread {
        @Override
        public void run() {
            try {
                DatagramSocket socket = new DatagramSocket();
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                DatagramPacket packet = null;
                while((line = reader.readLine())!=null) {
                    packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.15.255"), 9090);
                    socket.send(packet);
                    socket.close();
                }
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        
        }
    }
    //接收
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class Demo2 extends Thread {
        @Override
        public void run() {
        
                try {
                    DatagramSocket socket = new DatagramSocket(9090);
                    byte[] buf = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buf, buf.length);
                    boolean flag = true;
                    while(flag) {
                        socket.receive(packet);
                        System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf,0,packet.getLength()));
                    }
                    socket.close();
                } catch (SocketException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
    }
    //启动多线程
    public class Demo4 {
        public static void main(String[] args) {
            Demo3 receive = new Demo3();
            receive.start();
            
            Demo2 send = new Demo2();
            send.start();
        }
    }

    udp是一个不可靠(数据包可能会丢失的协议,什么情况下数据包会出现丢失呢?,并测试
    1.带宽不足 。
    2.cpu的处理能力不足。
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Demo5 {
        
        public static void main(String[] args) throws Exception {
            //建立udp的服务
            DatagramSocket socket = new DatagramSocket();
            //准备数据,数据封装到数据中发送
            DatagramPacket packet = null;
            for(int i =  0 ; i< 10; i++){  //连续发送10个数据包,如果你家机子好网速好就加大数据量
                String data =i +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
                //发送数据包
                socket.send(packet);
            }
            //关闭资源
            socket.close();
        }
    }
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class Demo6 {
        
        public static void main(String[] args) throws IOException, Exception {
            //建立udp的服务
            DatagramSocket socket = new DatagramSocket(9090);
            
            //建立空的数据包存储数据
            byte[] buf = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            
            //不断接收数据包
            while(true){
                socket.receive(packet);
                System.out.println(new String(buf,0,packet.getLength()));
                Thread.sleep(10);
            }    
        }
    }

    之所以上一段代码不关闭接收端socket是为了无限接收数据。

  • 相关阅读:
    汇编中push寄存器的影响
    windows lsp 指导
    java匹配中文汉字的正则表达式
    php中preg_match用户名正则实例
    Javascript中while和do-while循环用法详解
    如何找出MySQL数据库中的低效SQL语句
    asp.net连接oracle的问题及方法总结
    asp.net运算符之逻辑运算符以及其他运算符
    用命令行将Java程序打包为jar文件
    php 中cookie和session的用法比较
  • 原文地址:https://www.cnblogs.com/JYDesigner/p/9429587.html
Copyright © 2020-2023  润新知