使用Socket
Socket是两台主机之间的一个连接。它可以完成7个基本操作:
- 连接远程机器。
- 发送数据。
- 接受数据。
- 关闭连接。
- 绑定端口。
- 监听入站数据。
- 在绑定端口上接受来自远程机器的连接。
Java的Socket类(客户端和服务端都可以使用)提供了前4个操作的方法。后面3个操作仅服务器需要,即等待客户端的连接,这些操作由ServerSocket类实现。
构造和连接Socket
java.net.Socket类是Java完成客户端TCP操作的基础类。其他建立TCP网络连接的面向客户端的类(如URL、URLConnection、Applet和JEditorPane)最终都会调用这个类的方法。
设置超时时间
强烈推荐使用setSoTimeOut()方法为连接设置一个超时时间。超时时间按毫秒度量,所以下面这个语句设置socket在15秒无响应之后超时:
socket.setSoTimeOut(15000);
对于一个本地内部网服务器来说,15秒的响应时间太长了,但是对于一个负载很大的公共服务器(如time.nist.gov),这个时间则很短。一旦打开socket并设置其超时时间,可以调用getInputStream() 来返回一个InputStream,用它从socket读取字节。
基本构造函数
每个Socket构造函数指定要连接的主机和端口。主机可以指定为InetAddress或String。远程端口指定为1到65535之间的int值:
public Socket(String host, int port) throws UnknownHostException, IOException
public Socket(InetAddress host, int port) throws IOException
这些构造函数会连接socket,即在构造函数返回之前,会与远程主机建立一个活动的网络连接。
选择从哪个本地接口连接
有两个Socket构造函数可以指定要连接的主机和端口,以及从哪个接口和端口连接:
public Socket(String host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException
public Socket(InetAddress host, int port, InetAddress interface, int localPort) throws IOException
这个Socket连接到前两个参数中指定的主机和端口。它从后两个参数指定的本地网络接口和端口来连接。
构造但不连接
如果没有为Socket构造函数提供任何参数,它就没有目标主机可以连接:
public Socket()
可以以后再为某个connect()方法传入一个SocketAddress来建立连