1. 程式人生 > >java的UDP和TCP詳解和北京-賽車平臺出租源碼分析

java的UDP和TCP詳解和北京-賽車平臺出租源碼分析

ati 消息 byte ide 一段 pack catch 打包 println

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);    
    }
}

}

java的UDP和TCP詳解和北京-賽車平臺出租源碼分析