java的UDP和TCP詳解和北京-賽車平臺出租源碼分析
阿新 • • 發佈:2018-07-21
ati 消息 byte ide 一段 pack catch 打包 println 1、需求分析北京-賽車平臺出租Q1446595067
最近在和硬件做網口的傳輸協議,一開始告訴我說用TCP的socket進行傳輸,我說沒問題,就寫了個socket的發送和接收方法。but過了沒一段時間,又告訴我用udp吧,udp傳的比較快,就也寫了一個udp的。無論是socket還是udp,感覺網上有很多都是寫一個監聽端口,監聽往這個端口發送的數據,然後再寫一個發送方法。 在我的理解就是TCP慢,但是安全,有連接,可以直接有返回值
最近在和硬件做網口的傳輸協議,一開始告訴我說用TCP的socket進行傳輸,我說沒問題,就寫了個socket的發送和接收方法。but過了沒一段時間,又告訴我用udp吧,udp傳的比較快,就也寫了一個udp的。無論是socket還是udp,感覺網上有很多都是寫一個監聽端口,監聽往這個端口發送的數據,然後再寫一個發送方法。
2、問題難點
本來硬件要是往java端指定端口發,就完全沒問題了,但是它是把我發送的數據按照我發的端口號原路返回,就想http發送方式一樣。已下子就難住我了,兩個方式都是查了好多資料才找到發送的時候同時像http一樣接收返回值
3、UDP和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詳解和北京-賽車平臺出租源碼分析