socket如何使用java创建数据包并发送?
嗨,我正在从GPS设备获取数据,我想通过创建数据包将响应发送回GPS设备我的数据包是这样的
No. Field TYPE Length description
1 sMark Char 6 Flag of message (\r\n*KW\0)
2 packetLe short 2 Message Length
3 CMD Short 2 0x8200
4 cErrorCodeChar 1 0x00OK, 0x01invalid deviceID
5 sEnd Char 2 message end "\r\n"
我想通过使用这个代码得到这样的数据包
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
sendData = sendString.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
我正在这样努力
ByteArrayOutputStream bytearrypacket = new ByteArrayOutputStream();
DataOutputStream dateoutputpacket = new DataOutputStream(bytearrypacket);
dateoutputpacket.writeChars("\r\n*KW\0");
dateoutputpacket.writeShort(15);
dateoutputpacket.writeShort(82);
dateoutputpacket.writeChar('1');
dateoutputpacket.writeChars("\r\n");
dateoutputpacket.flush();
byte[] result = bytearrypacket.toByteArray();
更新:
ByteArrayOutputStream bytearrypacket = new ByteArrayOutputStream();
DataOutputStream dateoutputpacket = new DataOutputStream(bytearrypacket);
dateoutputpacket.writeBytes("\r\n*KW\0");
dateoutputpacket.writeShort(15);
dateoutputpacket.writeShort(82);
dateoutputpacket.writeByte(1);
dateoutputpacket.writeBytes("\r\n");
dateoutputpacket.flush();
byte[] result = bytearrypacket.toByteArray();
更新内容2:
try {
ByteArrayOutputStream bytearrypacket = new ByteArrayOutputStream();
DataOutputStream dateoutputpacket = new DataOutputStream(bytearrypacket);
dateoutputpacket.writeBytes("\r\n*KW\0");
dateoutputpacket.writeShort(15);
dateoutputpacket.writeShort(82);
dateoutputpacket.writeByte(1);
dateoutputpacket.writeBytes("\r\n");
dateoutputpacket.flush();
byte[] result = bytearrypacket.toByteArray();
DatagramPacket responsepacket = new DatagramPacket(result, result.length, packet.getAddress(), packet.getPort());
dsocket.send(responsepacket);
} catch (IOException ex) {
ex.printStackTrace();
} catch (SecurityException se) {
se.printStackTrace();
} catch (IllegalBlockingModeException il) {
il.printStackTrace();
} catch (IllegalArgumentException ilg) {
ilg.printStackTrace();
}
# 1 楼答案
围绕ByteArrayOutputStream创建一个DataOutputStream;使用各种方法写入数据;然后从ByteArrayOutputStream中获取字节,并围绕其包装一个数据包
# 2 楼答案
我很快就把它拼好了。使用此函数,您可以创建一个字节数组,其中所有数据包信息都位于正确的位置。我使用了问题中的一些示例信息。这应该足以通过连接发送信息。您可以将字节数组直接传递到数据报中
}
记住,在java中进行通信时,数据类型、大小和格式并不总是与其他一些语言相同。 查看http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html以获得每种尺寸
希望这有帮助
编辑:
数据包是13*8=104位=000000000000000000000000000000000000000000000000000000000000000000000000
调用缓冲区[0]=(字节)sMark添加字符(例如A)
数据包是13*8=104位=001000001000000000000000000
调用缓冲区[6]=(字节)packetle添加字符(例如2)
数据包是13*8=104位=
[字符6字节][短1字节]
[010000000000000000000000000000000000][00000010]
注意:当您使用字节作为字符时,您需要添加一个额外的字节,因为java字符是16位的,否则您可能会丢失数据