有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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   0x00OK, 0x01invalid 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();
                    }

共 (2) 个答案

  1. # 1 楼答案

    围绕ByteArrayOutputStream创建一个DataOutputStream;使用各种方法写入数据;然后从ByteArrayOutputStream中获取字节,并围绕其包装一个数据包

  2. # 2 楼答案

    我很快就把它拼好了。使用此函数,您可以创建一个字节数组,其中所有数据包信息都位于正确的位置。我使用了问题中的一些示例信息。这应该足以通过连接发送信息。您可以将字节数组直接传递到数据报中

    public class Sample {
    
    public static void main(String[] args){
    
        byte[] packet = createMsg("\r\n*KW\0", (short)15, (short)82, '1', "\r\n");
    
        for(byte b : packet){
            System.out.println(b);
        }
    
    }
    public static byte[] createMsg(String sMark, short packetle, short cmd, char cErrorCode, String sEnd){
        byte[] buffer = new byte[13];
    
        char[] sMarkArr = sMark.toCharArray();
        char[] sEndArr = sEnd.toCharArray();
    
        // sMark
        buffer[0] = (byte) sMarkArr[0];
        buffer[1] = (byte) sMarkArr[1];
        buffer[2] = (byte) sMarkArr[2];
        buffer[3] = (byte) sMarkArr[3];
        buffer[4] = (byte) sMarkArr[4];
        buffer[5] = (byte) sMarkArr[5];
    
        // packetle
        buffer[6] = (byte)(packetle & 0xFF);
        buffer[7] = (byte)((packetle >> 8) & 0xFF);
    
        // cmd
        buffer[8] = (byte)(cmd & 0xFF);
        buffer[9] = (byte)((cmd >> 8) & 0xFF);
    
        // cErrorCode
        buffer[10] = (byte)(cErrorCode);
    
        // sEnd
        buffer[11] = (byte)sEndArr[0];
        buffer[12] = (byte)sEndArr[1];
    
        return buffer;
    }
    

    }

    记住,在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位的,否则您可能会丢失数据