【问题标题】:Writing to Socket outputStream w/o closing it写入 Socket inputStream 而不关闭它
【发布时间】:2011-02-19 01:23:14
【问题描述】:
我想给服务器写一些消息。
每次,仅对于电车,我都会关闭 outputStream 并在我必须发送下一条消息时重新打开它。
os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();
我怎样才能保持这个 Socket 的 OutputStream、os 处于打开状态并且仍然能够发送消息?
谢谢。
【问题讨论】:
标签:
java
sockets
network-programming
ou
【解决方案1】:
我在这里遗漏了一些东西。如果您不调用close,它将不会关闭。例如,
os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
// Do something
os.write("more message");
os.flush();
// When you are finally done
os.close();
【解决方案2】:
在大多数协议中,服务器接受 som 类型的 EOF 符号。发送这样的符号而不是关闭流。
例如,IRC 服务器将“\r\n”解释为消息的结尾。这将是一个打开的 OutputStream 上的 2 条消息:
PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.print("JOIN #channel1\r\n");
printStream.flush( );
printStream.print("JOIN #channel2\r\n");
printStream.flush( );
此外,您应该使用 DataOutputStream 包装您的 outputStream。这个包装器创建了更便携的输出。如果服务器和客户端具有不同的计算机架构,普通的 OutputStream 可能会导致某些原始数据类型出现问题。
【解决方案3】:
将Socket 的OutputStream 包装在PrintWriter 中并调用PrintWriter 的println 方法。
PrintWriter pw = new PrintWriter(socket.getOutputStream());
....
pw.println(message); // call repeatedly to send messages.
....
pw.close(); // when finished writing to server and want to close conn.
【解决方案4】:
我发现了问题,它位于客户端。
在客户端,我用过 -
count = inputStream.read(buffer)) > -1
也就是说,客户端等待服务器的 outputStream 关闭,然后处理传入的数据。