[英]Java client socket using writeBytes
我正在从缓冲区读取字符串并将其写入服务器。 我遇到的问题是,当我保持套接字打开并在循环中写入时,该字符串永远不会被服务器接收。 当我使用这个:
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();
}
}
显然,我不想一直打开和关闭套接字。 问题是什么?
每次要发送数据包时,都需要刷新套接字。 关闭套接字会强制执行自动刷新,这说明了为什么在套接字关闭时发送数据的原因。
即使关闭数据也不会将其写入套接字? (在您的第一个片段中)
另外,您是否尝试过使用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();
}
让我猜一猜。
buffer.get()
方法会阻塞吗? 如果是这样,那么问题就在于out.writeBytes(message)
不能保证将整个字节表示形式推送到服务器。 代替。 您的客户端很有可能已经缓冲了等待刷新到服务器的字节。
如果是这种情况,那么在每次调用writeBytes
之后调用flush都可以解决此问题。
但是,如果buffer.get()
方法没有阻塞,则调用flush不会有任何区别。 实际上,这只会增加网络流量。 因此,“以防万一”添加冲洗功能是一个坏主意。
另一种可能性是服务器端代码有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.