JAVA-Socket/ServerSocket API简述

一.Socket(套接字):Socket是实现P2P数据通讯的基础.

  • Socket()
  • Socket(String host,int port)
  • Socket(InetAddress,int port)
  • public void connect(SocketAddress address):将套接字连接到远程.如果已经bind或者connect,将抛出异常.链接将阻塞,直到成功或者失败返回.
  • public void bind(SocketAddress address):将Socket绑定到本地地址上.
  • SocketChannel getChannel(): NIO实现.获取与当前socket唯一绑定的"通道".
  • public InputStream getInputStream():获取当前套接字的输入流.可以通过inputStream获取数据.如果当前socket没有关闭,或者inputStream没有被shutdown,将返回.
  • public OutputStream getOutputStream():获取当前socket的输出流,允许在输出流中write数据.
  • public void setTcpNoDelay(boolean on):启用/禁用TCP_NODELAY选项.默认数据不会立即发送,而是先存储在缓冲区中,等缓冲区满或者指示发送时才会发送(block).发送一批数据后会等待接受对方对数据的回应,然后再发送下一批.此为Negale算法.此算法适合发送方需要持续发送较大数据块而且对数据响应允许延迟的情况,此算法在一定程度上减少了网络通信交互的次数,提高了传输效率.不过,如果发送的数据很小(简单指令)而且需要对数据立即回应的,Negale算法直接会导致发送方稍慢.默认TCP_NODELAY为false.可以通过此方法设置.如果为true,将会导致任何进入缓冲的字节,将被立即发送.
  • public void setLinger(boolean on,int linger):启用/禁用指定"逗留"的时间.设置为SO_LINGER选项.默认close()方法会立即返回,但是底层的socket实际上不会立即被销毁,它会延迟一段时间,直到所有的数据均已被发送,才会真正关闭Socket,断开连接(有点类似ServerSocket的REUSEADDR).如果此参数为true,且linger时间大于0,那么close方法将会被阻塞,底层的socket将会尝试尽力发送剩余的数据.如果阻塞时间超时(linger时间)或者数据已经发送完毕,close方法返回;否则数据被丢弃,此时socket关闭.当交互的数据相对重要且有完整性约束时,可以设置linger来尽力确保数据的发送.
  • public void setOOBInline(boolean on):启用/禁用OOBINLINE选项.此选项默认为false.如果为true,表示支持发送一个字节的紧急数据,可以通过sendUrgentData(int data)来发送紧急数据.这两个方法需要配合使用.如果为false,那么发送的紧急数据,接收方会丢弃.由于协议的限制和平台的实现,紧急数据的发送并非一定优先.而且接收方也无法分辨紧急数据和普通数据(stream方式).
  • public void SetSoTimeout(int timeout):设置SO_TIMEOUT.此参数对于inputStream上read操作有影响,允许read被阻塞(空闲的)最大时间.如果超时,将会抛出一个异常,不过底层的socket仍然是有效的.
  • public void setSendBufferSize(int size)/setReceiveBufferSize(int size):设置SO_SNDBUF/SO_RCVBUF.一般来说,传输较大的连续的block(HTTP,FTP),可以设置较大的sendBuffer,有利于减少网络交互的次数而提高传输效率,对于单次数据量较小的操作(游戏操作/指令操作),可以设置较小的sendBuffer,以确保数据可以被更快的响应.
  • public void setKeepAlive(boolean on):启用/禁用SO_KEEPALIVE.如果SO_KEEPALIVE为true,那么底层的TCP将会对连接的存活进行监视.当连接处于空闲状态,即没有实际数据操作时,本地TCP实现会发送一个"探测数据包"给远端.如果尝试几次,远端都没有响应,那么此链接将会被自动关闭.如果此参数为false,那么TCP将不会监视链接的有效性,不活动的客户端可能会永远存活下去,而无法发现服务器的崩溃.(即在空闲时,无法发现崩溃).
  • public void setReuseAddress(boolean on):当Socket关闭时,底层的socket不会立即释放本地端口,而是会等待一会,确定端口上不再有数据接收时,才会释放端口.这是为Socket上接收延迟数据,为了避免program关闭连接后,其他程序立即绑定到相同的端口,有可能此程序可能会读取到延迟的数据.REUSEADDR为false,那么新的进程/线程将无法绑定到旧端口上,知道socket释放.只有前后2个连接都设定了REUSEADDR为true,才会导致port重用.一般情况下,我们认为同一个程序的短暂重启,可以使用此参数.
  • public InputStream getInputStream() throws IOException:获取socket的输入流,实现类为SocketOutputStream.如果当前socket已经被关闭,则抛出SocketException异常.如果当前inputStream被关闭,例如通过socket.shutdownInput(),此时将抛出异常,即如果inputstream被关闭,将不能重新获取引用.此时如果对inputStream进行read操作,将会直接返回EOF(-1).
  • public OutputStream getOutputStream() throws IOException:获取socket的输出流,底层实现类为SocketOutputStream.
  • public void shutdownOutput():在不关闭socket的情况下,单向关闭输出流.此后将不能进行数据的发送.关闭当前socket的输出流,此时将会发送尚未发送的数据,并在此后追加EOF序列,即远端socket将会在read是获得-1.此后如果在OutputStream中调用write,将抛出IOException.
  • public void shutdownInput():在不关闭socket的情况下,单向关闭输入流.关闭当前socket的输入流,半关闭状态.输入流关闭后(API级别),将不能再次从inputStream中read数据,read时直接返回-1.底层对待此后收到的发送时,会直接忽略掉.
    while(inputStream.read() > 0){
    
    //nothing
    
    }
     
  •  public void setPerformancePreference(int connectionTime,int latency,int bandwidth):设定选项的现对重要性.设定连接时间,延迟和带宽.connectionTime为最小时间建立连接latency:表示最小延迟bandwidth:表示最高带宽这三个参数只是建议性选项,这三个值可以任意,值较大者表示重要性最高.

二.ServerSocket:远端Socket.实现连接的接受和数据的处理.

  • ServerSocket()
  • ServerSocket(int port,int backlog):其中backlog参数为服务器连接允许的最大队列长度,此值将会覆盖操作系统限定的最大长度.如果建立连接请求的个数大于最大尺寸,那么进程所在主机将会直接拒绝连接,导致socket连接异常.
  • public void bind(SocketAddress address):将serverSocket绑定到本机指定端口.
  • public ServerSocketChannel getChannel():获取与当前Socket绑定的唯一通道,NIO使用.
  • public void setSoTimeout(int time):用来控制serverSocket上accept阻塞的最大时间.其他参数和Socket几乎一致.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值