java套接字中字符串的Big-endian编码

java套接字中字符串的Big-endian编码,java,sockets,networking,encoding,packet,Java,Sockets,Networking,Encoding,Packet,我的要求是按照以下格式对字符串进行编码,以便通过java套接字发送 电报的前缀是按网络字节顺序(大端)排列的四字节长度字段。 +-------------------------------- ... ------+ 字节| 0 | 1 | 2 | 3 | 4 | 5 | x | +-------------------------------- ... ------+ 字段|--数据长度--|数据| +-------------------------------- ... ------

我的要求是按照以下格式对字符串进行编码,以便通过java套接字发送

电报的前缀是按网络字节顺序(大端)排列的四字节长度字段。

+-------------------------------- ... ------+ 
字节| 0 | 1 | 2 | 3 | 4 | 5 | x |
+-------------------------------- ... ------+ 
字段|--数据长度--|数据|
+-------------------------------- ... ------+ 
例如,如果电报中的字节数为300(0x012C),则长度字段填充如下:

+-------------------------------- ... ------+ 
|00 | 00 | 01 | 2C |数据(300字节)|
+-------------------------------- ... ------+

如何将java字符串转换成这种格式

例如:String request=“\Start\”为上面提到的格式

我尝试了request.getBytes(“UTF8”),但不兼容,它崩溃了(服务器是用.NET编写的)。对我来说,服务器是一个黑盒子

    final Socket SOCKET = new Socket(hostName, portNumber);

    Writer out = new OutputStreamWriter(SOCKET.getOutputStream(), "UTF8");

    StringBuffer buffer = new StringBuffer();
    try {
        FileInputStream fis = new FileInputStream("c:/request.txt");
        InputStreamReader isr = new InputStreamReader(fis, "UTF8");
        Reader in = new BufferedReader(isr);
        int ch;
        while ((ch = in.read()) > -1) {
            buffer.append((char) ch);
        }
        in.close();

    } catch (IOException e) {
        e.printStackTrace();

    }

    ;
    String r = buffer.toString();


    char[] c = r.toCharArray();
out.write(c);
out.flush()


DataOutputStream具有按网络字节顺序写入原语的方法。在本例中,您需要四个字节,因此可以使用writeInt()写入长度字,然后写入字节

您可能希望在DataOutputStream和套接字输出流之间放置一个BufferedOutputStream,并且仅在写入消息的所有部分后才刷新它


注意:去掉可用的()测试。如果需要响应,只需阻塞read()方法。

您是否应该将
字符串
转换为
字节[]
(理想情况下使用固定编码,例如UTF-8),然后按照描述对该字节数组进行编码?您尝试了什么,困难是什么?我尝试了request.getBytes(“UTF8”)但不兼容,它崩溃了(服务器是用.NET编写的)。对我来说,服务器是一个黑盒,“不兼容”并没有真正给我们任何信息。(当然,您仍然需要使用长度前缀对数据进行编码。)服务器需要什么编码?如果没有这些信息,我们可能无法帮助您。我所说的不兼容是指服务器崩溃而没有任何响应。如何使用该长度前缀对数据进行编码。抱歉,因为我只是一个初学者,所以我的问题可能非常基本。如果你尝试使用UTF-8,你必须有一些代码,你已经尝试编码长度前缀。你应该在问题中包括这一点。(提示:DataOutputStream将帮助您…)
    new Thread(new Runnable() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    while (SOCKET.getInputStream().available() != -1) {
                        System.out.println(SOCKET.getInputStream().read());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();