public SocketAddress getRemoteSocketAddress()
public InetAddress getInetAddress()
public int getPort()
public SocketAddress getLocalSocketAddress()
public InetAddress getLocalAddress()
public int getLocalPort()
上面6个方法获取本地和远程主机端口相关的信息。如果socket未连接则返回null,如果socket已经关闭则返回已经连接过的本地和远程主机端口的信息。
public void connect(SocketAddress endpoint)
public void connect(SocketAddress endpoint, int timeout)
connet放提供了两个方法,一个是传入一个SocketAddress 进行连接目标地址 另一个是通过一个SocketAddress 和超时等待时间来连接目标地址。
代码示例:
Socket socket = new Socket();
SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80);
socket.connect(socketAddr);
//socket.connect(socketAddr, 2000);
代码中使用了Socket的空构造函数进行构造Socket对象。空构造不会进行连接目标主机(因为没有设置目标地址),需要使用connet方法进行连接目标主机。
//构造代理服务器地址
SocketAddress sa = new InetSocketAddress("192.168.10.130", 808);
//构造Socket代理
Proxy proxy = new Proxy(Proxy.Type.SOCKS, sa);
//使用代理创建socket
Socket socket = new Socket(proxy);
//构造目标地址
SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80);
//socket使用代理连接目标地址
socket.connect(socketAddr);
使用public Socket(Proxy proxy)构造方法来构造一个使用proxy的socket。 以后使用该socket的相关的网络操作都会通过代理服务器进行连接。
使用下面两个放进行向远程主机读取数据和写入数据进行交互。
public InputStream getInputStream()
public OutputStream getOutputStream()
通过这两个方法我们可以发现,使用socket进行交换操作,其实就是对流的操作。
下面是使用getInputStream和getOutputStream方法对远程主机进行交换的示例。
Socket socket = new Socket("127.0.0.1", 9000);
OutputStream os = socket.getOutputStream();
//通过OutputStream流向远程服务器写如数据
...
InputStream is = socket.getInputStream();
//通过InputStream流读取响应的数据。
...
如果想关闭socket的输入或输出则可以使用一下两个方法。
public void shutdownInput()
public void shutdownOutput()
当调用shutdownInput()时,则不允许再次从socket中读取数据。 当调用shutdownOutPut()方法后会告诉流已经输入完成,不允许再次输入。对方读取流时,会接受到流结束标志(会返回-1)。
但关闭输入或输出是不会关闭socket的,因为他们不会释放本地端口,还需要调用socket的close()方法来关闭socket。
下面两个方法来判断socket的输入或输出流是否关闭。
public boolean isInputShutdown()
public boolean isOutputShutdown()
如果socket未连接(通过空构造方法构造的socket),也会返回false(未关闭状态)。
//是否连接过目标地址
public boolean isConnected()
//是否关闭过socket
public boolean isClosed()
isConnected方法并不是连接状态才返回true,而是只要连接过目标地址就返回true,哪怕已经关闭的socket也会返回true的。 isClosed方法是判断socket是否调用close()方法关闭过socket。 如果使用空构造方法构建socket而不连接目标主机,还没调用close方法,该方法会返回true。
所以要判断该socket是否连接目标地址需要这样判断
//打开过连接,但还没有关闭连接
if(socket.isConnected() && !socket.isClosed()){
System.out.println("连接状态");
}else{
System.out.println("未打开连接或已经关闭连接");
}
java中只支持9个选项。下面简单描述下
public void setTcpNoDelay(boolean on)
public boolean getTcpNoDelay()
public void setReuseAddress(boolean on)
public boolean getReuseAddress()
InetAddress addr = InetAddress.getByName("192.168.31.186");
System.out.println(addr.getHostAddress());
Socket socket = new Socket("www.baidu.com",80,addr,9999);
//关闭后不会马上是否端口
socket.close();
//如果
socket.setReuseAddress(false);
socket = new Socket("www.baidu.com",80,addr,9000);
socket.close();
public synchronized int getSoTimeout()
public int getSoLinger()
public void setKeepAlive(boolean on)