2016-08-11 63 views
0

这真是令人尴尬。我想通过套接字发送一个大的JSON文件,并且字符串自然超出了限制,所以我试着压缩它,但由于某种奇怪的原因,我只能在服务器端获得单个字节。这是我到目前为止有:通过套接字发送大型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

甲侧面说明:'InflaterInputStream.available()'将EOF后返回1 EOF之前和0。在这种情况下,它仅仅意味着流有数据。 –

+0

“*字符串自然超出限制*” - 您指的是什么限制?为什么*客户*创建*服务器套接字*,*服务器*创建*客户套接字*?在任何情况下,与插座输入打交道时,你通常应该包括输入缓冲,如:'DataInputStream类中=新DataInputStream所(新GZIPInputStream(新的BufferedInputStream(server.getInputStream())));' –

回答

0

原来我只是不得不删除GZIPInputStream和GZIPOutputStream,所以随时根据您要发送与插座的大字符串使用这种技术,我找不到互联网上的任何其他/更好的方式。

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. 
} 
+0

这就是我在做的开始..但我有一个异常,该字符串对于DataOutputStream来说太大了。如果我将字符串切成字节,新行会被删除?没有打算也不想要。 – TimNeutron

+1

@BetimNeutron新行被删除,如果你'readLine()'消耗新行和'append'只写入行的内容。 –