socket模型:

1、阻塞模型

一个单进程accept阻塞,接收到客户端请求后,read消息,处理write返回,然后循环继续accept。

这种模型最最简单,不实际,没什么实际用途,对于新手教学还行。

2、多进程(线程)模型

主进程循环accept阻塞,接收到客户端请求后,fork子进程处理,子进程read阻塞,接收客户端消息并响应。

这种模型是我使用到最多的,简单实用,但是当客户端请求超多时,fork子进程多,系统资源消耗大,效果不理想;当然这种与多线程同理。

3、进程池(线程池)

主进程产生固定多的子进程,并定时监控子进程状态,初始子进程都为空闲状态。子进程在accept到客户端请求,通知主进程我很忙,然后处理请求,请求处理完成后,通知主进程我很闲。主进程主要监控子进程是否僵死或退出,维护进程池固定数量的进程来处理消息。

这种模型,可能每个人的实现方式不一样,这是我接触到的。优点是:不会产生超多的进程(线程)以至于过多消耗资源,在请求数量不多的情况下,效果还好;缺点是:因为是‘池’都有限制,当远远超过进程池限制的进程数,效果并不理想。

4、连接池

这种实现方式我第一次听说,在网上查了好久也没有头绪。在我的理解里,socket都是客户端向服务端发请求建立socket连接,因为客户端不同这种连接怎么重用?请高手指点一二,主要讲清原理即可。

5、select事件模型

这种实现方式是主进程将socket监听连接和client请求连接一起FD_SET到一个内核队列中,内核一直检查这个队列的哪个socket描述符有读或写或异常的响应则通知用户进程。用户进程检测到socket监听连接有响应,则accept与客户端建立连接,并把新的client请求连接FD_SET到内核队列中;如果检测到client请求连接有响应,则fork子进程,read客户端消息,处理并响应消息。

这种模型,select会捕获到你设置的某个socket描述符有可读可写或异常的事件,但是程序员需要自己检查自己设置的所有描述符,以确认是哪个描述符有事件发生。优点:占用资源少,不会消耗太多的cpu;缺点是select的效率和FD_SET到内核队列中的描述符的个数有关,当需要检测的描述符过多时,就要花费过多的时间去检测所有的描述符是否有时间发生,而且可以FD_SET的描述符内核也有限制,当客户端请求成千上万时,select便无能为力。

6、epoll事件模型

这种模型我刚开始接触,目前还没有完全使用或练习过。但是实现方式却是目前最好的一种模型,对设置监测的socket描述符同时设置回调函数,当内核监测到socket描述符有事件发生,则会主动触发回调函数。

这种模型,优点:可以接收任意多的连接,高效率,低消耗,稳定易使用;缺点:因为各系统提供的接口有很大的差异,可移植性差。

java中的socket模型_Socket通信模型相关推荐

  1. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  2. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

  3. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

  4. asp.core api 通过socket和服务器通信发送udp_读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  5. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码

    本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...

  6. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  7. java socket监控_ZeroMQ(java)中监控Socket

    基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情.. 而且由于ZeroMQ中将连接的建立 ...

  8. java中集合的模型特点_Java 学习笔记(十四)集合

    集合 在开发的时候,如果需要存储多个数据,可以使用数组,不过数据是固定长度的,如果需要存储可变长度的多个数据,可以使用集合.集合提供存储空间可变的存储类型,存储的容量可以实时改变 集合分类 Colle ...

  9. java内部模型,13 张图拆解 Java 中的内存模型

    前言 了解Java中的对象.变量等存放的内存区域十分重要 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢 示意图 目录 示意图 1. 内存模型 & 分区 Java虚 ...

最新文章

  1. 获取地区html代码,根据ip地址获取所在城市信息(省市县)代码
  2. windows7 下的日期没有internet时间的选项卡
  3. 实用Java程序设计教程_java程序设计实用教程 书中代码.pdf
  4. 【Python基础】50个令人大开眼界的 Matplotlib 可视化项目
  5. 将Python脚本打包成可执行文件
  6. 路径规划算法_自动驾驶汽车路径规划算法浅析
  7. python怎么索引json中的值_使用Python在JSON中查找值
  8. JAVA——多线程——实现n个共享数据的线程同步
  9. 《Sibelius 脚本程序设计》连载(三十九) - 4.9 SystemStaff
  10. ROS-手势控制小海龟移动
  11. react native开发的新闻客户端
  12. linux rvm,RVM 实用指南
  13. ftp服务器文件查找功能,ftp服务器查找文件
  14. socket与sock的联系
  15. html代码在线运行_在线运行html代码
  16. python平方和计算技巧,python平方和计算技巧 Python算法练习题:四平方和
  17. django创建app的命令
  18. 【简单图形解释】刚体上任意一点速度与刚体角速度的关系
  19. ibatis中配置parameterClass=java.util.HashMap的用法
  20. 【数据结构】用堆排序解决TOPK问题

热门文章

  1. python模块:JSON模块
  2. LeetCode题 - 83. 删除排序链表中的重复元素 python实现
  3. 数据的属性及“数据的特征”
  4. 熵、交叉熵、相对熵(KL 散度)意义及其关系
  5. ASP.NET网站发布-允许更新此预编译站点
  6. mysql 5.6.30 编译_编译安装mysql 5.6.30
  7. mongodb模糊查询_MongoDB技术从0到1+
  8. Leetcode —— 1469. 寻找所有的独生节点(Python)
  9. leetcode —— 752. 打开转盘锁
  10. leetcode - 739. 每日温度