我需要通过Java套接字向服务器发送文本消息,然后发送一个字节数组,然后发送一个字符串等... 我到目前为止开发的是工作,但客户端设法只读取已发送的第一个字符串。
从服务器端:我使用BufferedOutputStream
发送字节数组,PrintWriter
发送字符串。
问题是客户端和服务器没有同步,我的意思是服务器发送字符串然后字节数组然后字符串而不等待客户端消耗每个所需的字节。
我的意思是情景不是这样的:
Server Client
Send String read String
Send byte read byte
但它是这样的:
Server Client
Send String
Send byte
Send String
Send byte
read String
read byte
read String
read byte
可能有用的东西是我确切知道每个字符串的大小以及要读取的每个字节数组。
以下是分别用于发送字符串和字节数组的方法:
// Send String to Client
// --------------------------------------------------------------------
public void sendStringToClient (
String response,
PrintWriter output) {
try {
output.print(response);
output.flush();
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("send Seeder String : " + response);
}
// Send Byte to Client
// --------------------------------------------------------------------
public void sendByteToClient (
byte[] response,
BufferedOutputStream output) {
try {
output.write(response, 0, response.length);
//System.out.println("send : " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
以下是分别用于读取字符串和字节数组的方法:
public byte[] readInByte(int size) {
byte[] command = new byte[size];
try {
this.inByte.read(command);
} catch (IOException e) {
e.printStackTrace();
}
return command;
}
public String readInString(int size) {
char[] c = new char[size];
try{
this.inString.read(c, 0, size);
} catch (IOException e) {
e.printStackTrace();
}
return String.valueOf(c);
}
答案 0 :(得分:2)
可能有用的东西是我确切地知道要读取的每个字符串的大小以及要读取的每个字节数组。
完全。那是非常共同的。基本上你为每条消息加上前缀 - 你可能想要提供更多的标题信息(例如字符串或字节数组消息)。
您可以将消息长度(总是以字节为单位)表示为固定的字节数(例如4,假设您从不需要超过4GB的消息)或使用7位编码的整数(您发送7位的每个字节的长度,最高位只表示这是否是长度的最后一个字节)。
一旦你有了消息长度,你基本上就已经设置了 - 你已经有效地将 stream 数据划分为自描述块。完成工作。
(顺便说一下,由于它的异常吞咽性质,我会避免使用PrintWriter
。一旦你这样做,你实际上并不需要作者,因为你可能想要转换无论如何,每个String
进入一个字节数组,在发送之前计算其长度(以字节为单位)。记住指定编码!)
答案 1 :(得分:0)
我真的很想将数据转换为JSON格式并将其通过http传输。您可以获得大量的好处,包括现成的http服务器和几乎所有平台的客户端以及JSON互操作,更不用说所有内置的错误处理和恢复处理。
缺点是http和JSON编码的额外开销。您没有提到这是否是UDP或TCP套接字,因此如果您尝试无连接,这可能是一个额外的缺点。