通过套接字发送大型JSON文件

时间:2016-08-11 22:02:33

标签: java json sockets

这很令人尴尬。我试图通过套接字发送一个大的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,并且程序不再执行,它只是在那里停止(它不会终止) 有任何想法吗?我认为获得外部视角可能会有所帮助,因为它可能是我错过的东西,显而易见的东西。感谢。

2 个答案:

答案 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>