这很令人尴尬。我试图通过套接字发送一个大的JSON文件,当然字符串超出限制,所以我尝试压缩它,但由于一些奇怪的原因我只在服务器端获得一个字节。这就是我到目前为止所做的:
服务器端:
StringBuilder sb = new StringBuilder();
String str;
while((str = request.getReader().readLine()) != null)
sb.append(str);
Socket client = new Socket("localhost", 8081);
OutputStream outServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(new GZIPOutputStream(outServer));
byte[] buff = sb.toString().getBytes("UTF-8");
System.out.println(buff.length);
out.writeInt(buff.length);
out.write(buff);
out.flush();
client.close();
buf 的长度是198153,在我尝试使其工作的特定情况下。
客户端:
ServerSocket serverSocket = new ServerSocket(8081);
Socket server = serverSocket.accept();
DataInputStream in = new DataInputStream(new GZIPInputStream(server.getInputStream()));
System.out.println(in.available());
int len = in.readInt();
byte[] buff = new byte[len];
in.readFully(buff);
String response = new String(buff, "UTF-8");
System.out.println(response);
updateMessage(response);
server.close();
serverSocket.close();
在这种情况下, in.available()只有1,并且程序不再执行,它只是在那里停止(它不会终止)
有任何想法吗?我认为获得外部视角可能会有所帮助,因为它可能是我错过的东西,显而易见的东西。感谢。
答案 0 :(得分:0)
因为你每个连接只发送一条消息(这对于小消息来说效率低,但是对于较大的消息来说它并不重要)我只是将整个消息作为文本发送并一次性读取整个消息
注意:您的代码会删除我怀疑无意的所有新行。
为每个连接写一条消息。
try (Socket client = new Socket("localhost", 8081);
Writer writer = new OutputStreamWriter(new GZIPOutputStream(client.getOutputStream()), "UTF-8")) {
char[] chars = new char[8192];
for (int len; (len = request.read(chars)) > 0;)
writer.write(chars, 0, len);
}
阅读
try (Socket server = serverSocket.accept();
Reader reader = new InputStreamReader(new GZIPInputStream(server.getInputStream()), "UTF-8")) {
// read the text as above.
}
答案 1 :(得分:0)
原来我只需要删除GZIPInputStream和GZIPOutputStream,所以每当你想发送带有套接字的大字符串时,请随意使用这种技术,我也无法在互联网上找到任何其他/更好的方法。 / p>