基于BIO模型的Java Socket传统编程

基于BIO模型的Java Socket传统编程

这张照片2014年拍摄于桑科草原。

     

基于BIO模型的Java Socket传统编程

王皓的GitHub:https://github.com/TenaciousDWang

 

       在网络编程中,我们经常需要两个端点程序进行通讯,通过连接来交换数据,这就需要scoket编程。

socket通讯过程如下:

  1. Server端Listen(监听)某个端口是否有连接请求。
  2. Client端向Server 端发出Connect(连接)请求。
  3. Server端向Client端发回接受消息。
  4. 连接建立后,Server端和Client 端都可以打开输入/输出流通过Send,Write等方法与对方通信。
  5. 关闭sockt连接。

       在Java中我们一般使用java.net包中的Socket与ServerSocket这两个类来实现该过程。下面是基于Block Input/Output 模型的传统Socket编程实现。

  1. 首先是服务端IOServer.java
  2. 创建一个serverSocket对象,用来监听8000端口。
  3. 创建一个线程,用来接收新的连接。
  4. 在上述线程里,无限while循环,一直调用阻塞方法accept来不断获取新的连接。
  5. 当获取到新的连接后,创建一个新的线程,负责专门读取该连接中的数据。
  6. 代码中我们使用字节流来读取数据。

基于BIO模型的Java Socket传统编程

    其次是客户端IOClient.java

  1. 创建一个线程用来执行每三秒向服务端发送消息。
  2. 创建Socket。
  3. 打开连接到Socket的输入/输出流,写入数据。

基于BIO模型的Java Socket传统编程

        传统BIO模型下的Socket编程在客户端较少的使用情况下运行尚可,但是如果客户端有成千上万的情况下,就比较捉急了,因为我们看到,在IOServer.java中每创建一个新的连接,都需要一个线程用while死循环来维持流的读写操作,如果有1万的连接,就会对应1万个死循环线程,如此,众多的阻塞线程对操作系统消耗很大,其次我们知道Java对于多线程是通过切换线程来运行程序的,有限的资源对应如此多的线程,会导致线程频繁的切换,导致效率低下,为了应对这种情况在JDK1.4版本之后Java加入了基于Non-blocking Input/Output模型的Socket编程包java.nio

公众号地址:

基于BIO模型的Java Socket传统编程