Java Socket详解
Socket
构造Socket
构造方法
Socket socket = new Socket();
Socket(); //无参数
Socket(Proxy proxy); //指定代理
Socket(InetAddress address,int port); //指定目标IP、目标端口
Socket(String host,int port); //指定目标主机名、目标端口
Socket(InetAddress host,int port,boolean stream); //指定目标IP、目标端口、是否使用TCP(默认UDP)
Socket(String host,int port,boolean stream); //指定目标主机名、目标端口、是否使用TCP
Socket(InetAddress address,int port,InetAddress localAddr,int localport); //指定目标IP、目标端口、本地IP、本地端口
Socket(String host,int port,InetAddress localAddr,int localport); //指定目标主机名、目标端口、本地IP、本地端口
Proxy proxy = new Proxy(Type type,SocketAddress sa); //创建代理
InetAddress addr = InetAddress.getLocalHost(); //返回本地IP
InetAddress addr = InetAddress.getByName("x.x.x.x"); //返回"x.x.x.x"的IP
InetAddress addr = InetAddress.getByName("www.xxx.com"); //返回域名的IP
注:除第一个方法不会立即连接,其他都会连接。
无参数连接方法
SocketAddress endpoint = new InetSocketAddress(host,port); //创建目标
socket.connect(SocketAddress endpoint); //连接
socket.connect(SocketAddress endpoint,int timeout); //设定超时时间(单位为毫秒,如为0,则永不超时)
异常类型
IOException
- UnknownHostException:IP无法识别
- SocketException
- ConnectException:服务器拒绝连接
- BindException:端口绑定失败
- InterruptedIOException
- SocketTimeoutException:连接超时
常用选项
TCP_NODELAY:立即发送数据
socket.setTcpNoDelay(boolean on); //设置
socket.getTcpNoDelay(); //查看是否开启
注:默认采用Negale算法:将需发送的数据,置于缓冲区,等待缓冲区被置满,则发出。
SO_RESUSEADDR:是否允许重用Socket所绑定的本地端口(需在连接前设置)
socket.setResuseAddress(boolean on); //设置
socket.getResuseAddress(); //查看是否开启
注:当关闭服务时,端口不会立即释放,如另一程序需占用此端口,会失败。
SO_TIMEOUT:接收数据时等待超时时间
socket.setSotimeout(int timeout); //设置
socket.getSoTimeOut(); //查看超时时间
SO_LINGER:当执行close()时,是否关闭底层Socket(阻塞)
socket.setSoLinger(boolean on,int linger); //设置
socket.getSoLinger(); //查看阻塞时间
SO_SNFBUF:输出数据的缓冲区大小
socket.setSendBufferSize(int size); //设置
socket.getSendBufferSize(); //查看输出数据的缓冲区大小
SO_RCVBUF:输入数据的缓冲区大小
socket.setReceiveBufferSize(int size); //设置
socket.getReceiveBufferSize(); //查看输入数据的缓冲区大小
SO_KEEPALIVE:对长时间空闲的Socket是否自动关闭
socket.setKeepAlive(boolean on); //设置
socket.getKeepAlive(); //查看是否开启
注:当连接处于空闲状态(连接的两端没有互相传送数据)超过2个小时时,本地TCP发送一个测试数据包,如未接收响应,将进行11分钟的测试,直至接收响应;如在12分钟内未接收响应,则自动关闭本地Socket。
默认值为false。
不同平台时限不同。
OOBINLINE:是否支持发送一个字节的TCP紧急数据
socket.setOOBInline(boolean on); //设置
socket.getOOBInline(); //查看是否开启
服务类型选项
IP4种服务类型(trafficClass标准值)
-
低成本:0x02
-
高可靠:0x04
-
最高吞吐量:0x08
-
最小延迟:0x10
订制方法
socket.setTrafficClass(int tc); //设置
socket.getTrafficClass(); //查看服务类型
设定连接时间、延迟和带宽
参数(相对权重)
三个参数之间的相对大小决定相应参数的相对重要性。
- connectionTime:最少时间建立连接
- latency:最小延迟
- bandwidth:最高带宽
socket.setPerformancePreferences(int connectionTime,int latency,int bandwidth); //设置
绑定端口
socket.bind(SocketAddress bindpoint); //绑定本地端口
Socket信息
socket.getInetAddress(); //获取远程服务器IP
socket.getPort(); //获取远程服务器端口
socket.getLocalAddress(); //获取本地IP
socket.getLocalPort(); //获取本地端口
socket.getInputStream(); //获取输入流
socket.shutdownInput(); //关闭输入流
socket.getOutputStream(); //获取输出流
socket.shutdownOutput(); //关闭输出流
状态测试
socket.isClosed(); //是否关闭
socket.isConnected(); //是否连接过
socket.isBound(); //是否绑定端口
socket.isInputShutdown(); //输入流是否关闭
socket.isOutputShutdown(); //输出流是否关闭
Socket关闭
全关
socket.close() //关闭
半关
socket.shutdownInput(); //关闭输入流
socket.shutdownOutput(); //关闭输出流