博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于BIO模型的Java Socket传统编程
阅读量:4196 次
发布时间:2019-05-26

本文共 909 字,大约阅读时间需要 3 分钟。

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

     

王皓的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. 代码中我们使用字节流来读取数据。

    其次是客户端IOClient.java

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

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

公众号地址:

转载地址:http://fnzli.baihongyu.com/

你可能感兴趣的文章
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
最长回文子串(Go,LeetCode)
查看>>
奏响春的序曲,「武汉的春天」让人泪目
查看>>
“抢菜大战”背后:生鲜电商的突击大考
查看>>
骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
查看>>
二月手机好评排行榜公布:华为第一,小米10没上榜
查看>>
英特尔展示业界首个一体封装光学以太网交换机
查看>>
年存10W+的年轻人都是怎么攒钱的
查看>>
iPhone 11全球供应紧张:何时补货未知
查看>>
小米40W无线闪充今年商用:MIX 4首发?
查看>>
5000起步没商量!vivo NEX 3S 5G手机正式发布:骁龙865+无界瀑布屏加持
查看>>
二月1500-1999元性价比排行榜:前三都是魅族手机
查看>>
疫情下的“双11”,品牌逆势增长背后的数字化变革
查看>>
支付宝变色了!被绑架了你就眨眨眼?官方如此回应...
查看>>
罗永浩欲直播带货,京东说可以帮忙联系
查看>>
B站,正在变成下一个“公众号”?
查看>>
小米启动安心服务月 手机家电产品可免费清洁保养
查看>>
刘作虎:一加新品将全系支持 5G
查看>>