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();
是不是很简单?
需要注意的是:你不能总是像读取文件那样,一直从 Socket 的 InputStream 读取直到返回 -1。因为 -1 只有在服务器关闭连接时才会返回。但服务器并不总是会关闭连接——也许你希望在同一个连接上发送多个请求,这时如果服务器关闭连接就显得很不合理了。
因此,你必须明确知道应该从 Socket 的 InputStream 中读取多少字节。这可以通过以下两种方式实现:
- 服务器提前告知即将发送的数据字节数;
- 或者在数据中约定一个特殊的“结束字符”来标识数据结尾。
关闭 Socket
当你使用完 Java Socket 后,必须调用 Socket.close() 方法来关闭与服务器的连接,如下所示:
Socket socket = new Socket("mianshima.com", 80);
socket.close();