我正在从缓冲区读取一个字符串并将其写入服务器。我遇到的问题是,当我打开套接字并循环写入时,服务器永远不会收到字符串。 当我使用它时:
try {
Socket send = new Socket("localhost", 1490);
DataOutputStream out = new DataOutputStream(send.getOutputStream());
String message = null;
while ((message = buffer.get()) != null){
out.writeBytes(message);
}
out.close();
send.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
服务器没有收到字符串,但是当我这样做时它可以正常工作:
try {
String message = null;
while ((message = buffer.get()) != null){
Socket send = new Socket("localhost", 1490);
DataOutputStream out = new DataOutputStream(send.getOutputStream());
out.writeBytes(message);
out.close();
send.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
显然,我不想继续打开和关闭套接字。有什么问题?
答案 0 :(得分:1)
每次要发送数据包时都需要刷新套接字。 关闭套接字会强制自动刷新,这解释了为什么数据在套接字关闭时发送。
答案 1 :(得分:0)
即使关闭数据,数据也没有写入套接字? (在你的第一个片段中)
另外,您是否尝试过使用 flush 方法?你可以在这里阅读:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush(),你的代码如下:
try {
Socket send = new Socket("localhost", 1490);
DataOutputStream out = new DataOutputStream(send.getOutputStream());
String message = null;
while ((message = buffer.get()) != null){
out.writeBytes(message);
out.flush();
}
out.close();
send.close();
} catch (IOException ex) {
ex.printStackTrace();
}
答案 2 :(得分:0)
让我猜一下。
buffer.get()
方法会阻止吗?如果是这样,那么问题是out.writeBytes(message)
不能保证将整个字节表示推送到服务器。代替。您的客户端很可能有缓冲的字节等待刷新到服务器。
如果这是正在发生的事情,那么在每次调用writeBytes
后调用flush将解决问题。
但是如果buffer.get()
方法没有阻塞,那么调用flush将没有任何区别。实际上,它只会增加网络流量。所以添加同花顺“以防万一”是一个坏主意。
另一种可能性是服务器端代码有问题。