【问题标题】:Reading/Writing with Java Sockets使用 Java 套接字进行读/写
【发布时间】:2026-01-09 07:55:02
【问题描述】:

我已经与服务器建立了 TCP 连接,使用

String hostName = ...;
int portNumber = ...;
SocketAddress addr = new InetSocketAddress(hostName, portNumber);
Socket clientSocket = new Socket();
clientSocket.connect(addr, 100);

但现在我想向该服务器发送消息。
如何使用InputStreams 做到这一点?

【问题讨论】:

  • 你没有。你可以使用OutputStreams 和他们的write() 方法来实现它。

标签: java sockets inputstream


【解决方案1】:

有不同的方法来实现这一点。使用 Socket 完成的大部分通信都是通过它们的 In/OutputStreams 进行的。向套接字发送消息的简单方法是:

OutputStream output = clientSocket.getOutputStream();
output.write(Charset.getDefaultCharset().encode("Hello, world!"));

Charset.getDefaultCharset().encode(String) 用于将 String 转换为字节数组,因为除了字节之外无法轻松地通过套接字发送任何其他数据(查找“序列化”)

【讨论】:

  • 除了字节数组之外,实际上还有一些简单的方法可以读取或写入内容。只需装饰溪流即可。
  • 嗯,我想这是真的 ;) 但是开发你自己的协议的乐趣在哪里 ;P
  • 我想说不要将数据传输机制与协议混合。但老实说,我不明白你的意思。
【解决方案2】:

使用getInputStreamgetOutputStreamSocket 检索输入流和输出流。从那时起,您需要使用输出流(而不是输入流)向服务器发送消息:

Socket clientSocket = new Socket();
clientSocket.connect(addr, 100);
InputStream istream = clientSocket.getInputStream();
OutputStream ostream = clientSocket.getOutputStream();
 ... // write the message to ostream
 ... // read the server's reply from istream (if applicable)

您可能还想将这些流装饰成其他类型以方便您的工作,因为InputStreamOutputStream 在操作方面非常原始。例如,如果你想写一条短信,你可以使用PrintWriter

PrintWriter writer = new PrintWriter(ostream);
writer.print("My number: ");
writer.println(5);
writer.print("My name: ");
writer.println("John Doe");
writer.println("Done");
writer.flush();

【讨论】: