java的UDP和TCP详解和源码分析

1、需求分析

最近在和硬件做网口的传输协议,一开始告诉我说用TCP的socket进行传输,我说没问题,就写了个socket的发送和接收方法。but过了没一段时间,又告诉我用udp吧,udp传的比较快,就也写了一个udp的。无论是socket还是udp,感觉网上有很多都是写一个监听端口,监听往这个端口发送的数据,然后再写一个发送方法。

2、问题难点

本来硬件要是往java端指定端口发,就完全没问题了,但是它是把我发送的数据按照我发的端口号原路返回,就想http发送方式一样。已下子就难住我了,两个方式都是查了好多资料才找到发送的时候同时像http一样接收返回值

3、UDP和TCP的区别

在我的理解就是TCP慢,但是安全,有连接,可以直接有返回值

UDP发送速度快,返回值需要指定端口发送,不安全,就是你发你的,结果如何不知道

这里socket和udp的发送和接收方式网上很多就不写了。写一个发送后直接接收返回值的方法。

4、socket发送与接收

socket发送后,接收方按照原端口返回数据的接收方法,理论上和http发送后接收返回值一样

    @Override
    public void run() {
        try {
            Socket socket = new Socket(ip, port);
            OutputStream out = socket.getOutputStream();
                byte[] data = new byte[1];
                data[0] = 0x02;
                //data[1] = 0x2A;
                out.write(data);
                out.flush();
                //这里是接收发送后给返回来的值
                InputStream is = socket.getInputStream();
                byte b[] = new byte[1024];
                is.read(b);
                System.out.println(Arrays.toString(b));
                String val="";
                for(int i=0;i<b.length;i++){
                    if(b[0]==0){
                        break;
                    }
                    val=val+Integer.toHexString(b[i])+"";
                }
                System.out.println(val);
            out.close();
            //socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5、UDP发送和接收

原理和socket是一样的,都是发送后接收按原端口号返回来的值。

        DatagramSocket socket = new DatagramSocket();
        byte[] buf=new byte[1];
        buf[0]=0x02;
        //将数据打包
        DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.20"), 30000);
        socket.send(packet);
        buf = new byte[1024];
        // 解析数据包
        packet = new DatagramPacket(buf,buf.length);
        socket.receive(packet);
        buf = packet.getData();
        
        String hex=HexConversion.printHexString(buf,packet.getLength());
        DTO dto = new DTO();
        GiWaveformRealtime defineinfo=new GiWaveformRealtime();
        defineinfo.setEnlarge(1.0);
        defineinfo.setAdjustValue(0.0);
        double[] a=ChartUtils.getSpeend(hex,defineinfo);
        List<double[]> arrList=new ArrayList<>();
        arrList.add(a);
        dto.setDataRows(arrList);
        dto.setData(hex);
        socket.close();
        System.out.println(" 发来的消息:" +dto);
        socket.close();

6、再附上一个UDP分开的发送和接收方法,就是发送和接收时单独的。

public class Udp {
    
    public static void main(String[] args) {
        //send();
        Rescevice();
        
    }
    
    /**
     * 接收数据的方法
     * @throws Exception
     */
    public static void Rescevice() {
        try{
            System.out.println("开始执行");
             DatagramSocket socket = new DatagramSocket(10000);
                while (true) {
                    byte[] buf = new byte[1024];
                    // 解析数据包
                    DatagramPacket packet = new DatagramPacket(buf, buf.length);
                    socket.receive(packet);
                    String ip = packet.getAddress().getHostAddress();
                    buf = packet.getData();
                    String data = new String(buf, 0, packet.getLength());
                    System.out.println("收到 " + ip + " 发来的消息:" + data);
                }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * 发送数据的方法
     */
    public static void send()  {
        try {
             DatagramSocket socket = new DatagramSocket();
                byte[] buf = new byte[1];
                buf[0]=02;
                //将数据打包
                DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.0.49"), 30000);
                socket.send(packet);
                socket.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);    
        }
    }

}

猜你喜欢

转载自blog.csdn.net/f552126367/article/details/81134747