写入套接字输出流而不关闭它

发布于 2024-09-01 22:09:05 字数 223 浏览 6 评论 0原文

我想向服务器写入一些消息。 每次,仅对于传输,我都会关闭输出流,并在必须发送下一条消息时重新打开它。

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();

如何保持该 Socket 的 OutputStream, os, 打开并且仍然能够发送消息?

谢谢。

I'd like to write some messages to the server.
Each time, for the tramsmitting only, I'm closing the outputStream and reopen it when I have to send the next message.

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();

How Can I keep this Socket's OutputStream, os, open and still be able to send the message?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

小兔几 2024-09-08 22:09:05

我在这里缺少一些东西。如果不调用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();

I am missing something here. If you don't call close, it will not close. For example,

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();
清眉祭 2024-09-08 22:09:05

在大多数协议中,服务器接受某种 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 可能会导致某些原始数据类型出现问题。

In most protocols, the server accepts som kind of EOF symbol. Send such a symbol instead of closing the stream.

For example, IRC servers interpret "\r\n" as the end of a message. This would be 2 messages on one open OutputStream:

PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.print("JOIN #channel1\r\n");
printStream.flush( );
printStream.print("JOIN #channel2\r\n");
printStream.flush( );

Also, you should wrap your outputStream with DataOutputStream. This wrapper creates more portable output. Plain OutputStream can cause trouble with certain primitive datatypes if server and client have different computer architectures.

白馒头 2024-09-08 22:09:05

SocketOutputStream 包装在 PrintWriter 中,并调用 PrintWriterprintln > 方法。

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.

Wrap the Socket's OutputStream in a PrintWriter and call the PrintWriter's println method.

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.
我为君王 2024-09-08 22:09:05

我发现问题出在客户端。
在客户端,我使用了 -

count = inputStream.read(buffer)) > -1

这意味着客户端等待服务器的outputStream关闭,然后处理传入的数据。

I have found the problem and it lays on the client's side.
On the client, I have used -

count = inputStream.read(buffer)) > -1

That means, the client waits till server's outputStream closed, and then processing the incoming data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文