Java 网络编程:Socket

更新于 2025-12-26

Jakob Jenkov 2014-06-25

为了通过互联网(使用 TCP/IP 协议)连接到服务器,你需要在 Java 中创建一个 java.net.Socket 并将其连接到目标服务器。或者,你也可以选择使用 Java NIO 的 SocketChannel,如果你更倾向于使用 Java NIO。

创建 Socket

下面这段代码示例连接到 IP 地址为 128.46.14.151、端口为 80 的服务器。该服务器网站服务器,而 80 端口是 Web 服务器的标准端口。

Socket socket = new Socket("128.46.14.151", 80);

你也可以使用域名代替 IP 地址,如下所示:

Socket socket = new Socket("mianshima.com", 80);

向 Socket 写入数据

要向 Java Socket 写入数据,你必须先获取它的 OutputStream。方法如下:

Socket socket = new Socket("mianshima.com", 80);
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
out.flush();
out.close();
socket.close();

就是这么简单!

注意:当你确实希望将数据立即发送到服务器时,不要忘记调用 flush() 方法。因为操作系统底层的 TCP/IP 实现可能会对数据进行缓冲,并以更大的块(符合 TCP/IP 数据包大小)一次性发送出去。

从 Socket 读取数据

要从 Java Socket 读取数据,你需要获取它的 InputStream。方法如下:

Socket socket = new Socket("mianshima.com", 80);
InputStream in = socket.getInputStream();
int data = in.read();
// ... 继续读取更多数据 ...
in.close();
socket.close();

是不是很简单?

需要注意的是:你不能总是像读取文件那样,一直从 SocketInputStream 读取直到返回 -1。因为 -1 只有在服务器关闭连接时才会返回。但服务器并不总是会关闭连接——也许你希望在同一个连接上发送多个请求,这时如果服务器关闭连接就显得很不合理了。

因此,你必须明确知道应该从 SocketInputStream 中读取多少字节。这可以通过以下两种方式实现:

  • 服务器提前告知即将发送的数据字节数;
  • 或者在数据中约定一个特殊的“结束字符”来标识数据结尾。

关闭 Socket

当你使用完 Java Socket 后,必须调用 Socket.close() 方法来关闭与服务器的连接,如下所示:

Socket socket = new Socket("mianshima.com", 80);
socket.close();