java的UDP和TCP详解和北京-赛车平台出租源码分析

1、需求分析北京-赛车平台出租Q1446595067
最近在和硬件做网口的传输协议,一开始告诉我说用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.51cto.com/13880630/2147939