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);
- }
- }
- }
来源: http://www.bubuko.com/infodetail-2693890.html