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