java原生网络编程
常见知识点
socket:是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。将复杂的TCP/IP协议族隐藏在socket接口后面,而我们只需要让socket去组织数据,达到符合指定的协议要求。
短连接:传统的HTTP是无状态的,浏览器和服务器没进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。也就是说短连接是指socket连接后发送数据然后接收完数据后马上断开连接。
长连接:长链接就是在建立socket连接后不管是否在传输数据,都会保持连接状态。
InetAddress类:这个类是在java.net包下的,是对IP地址的高层表示。大多数其他网络类都要用到这个类,包括Socket、ServerSocket、URL等。一般来说他包括一个主机名和一个IP地址。
BIO
一般我们将通信编程里提供服务的叫服务端,连接服务端使用服务的叫客户端。服务端一般会监听暴露的端口,客户端会向服务端监听的端口发起连接请求,通过三次握手的操作,如果成功建立连接,则双方会通过套接字进行通信。
在传统的同步阻塞模型开发中,ServerSocket(服务端)负责绑定IP地址,启动监听端口;Socket(一般为客户端)负责发起连接操作。连接成功后双方通过输入和输出流进行同步阻塞式通信。
采用BIO通信模型的服务端,通常会有一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行请求处理,处理完成后通过输出流返回应答给客户端,当连接断开后,线程也就销毁了。如图所示
动图主要演示了一个流程,静态的图片是为了全局上看。我们可以发现,每次当有新的客户端来的时候服务端就会有一个新的线程被创建,当客户端与服务端断开连接的时候,线程就会被销毁。在数量不是特别大的时候这种方式可能没多大问题,但当客户端数量达到一定数量后,这种方式就十分不友好了,每次创建和销毁线程都需要消耗资源,而且计算机在线程数量过多时也会导致性能下降。现在我们通过线程池来改进一下这种模式,这也就是我们常见的伪异步I/O模型,它实现了一种N对M的模型。具体请看下面这张图(由上面的图演变而来):
一般情况下我们不会使用CachedThreadPool线程池,因为它是没有控制线程数量的,在无限创建线程之后同样会占用大量资源而影响性能。我们可以使用FixedThreadPool来有效的控制线程数量大小,从而控制了资源的占用,达到N对M的伪异步I/O模型。