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();		//关闭输出流
posted @ 2020-03-21 21:07  lisztomania  阅读(666)  评论(0编辑  收藏  举报