nio socket编程服务器端代码示例

lone wolf 2024-06-17 16:24:14
最佳回答
1传统io编程的不足: 对于客户端的每一次请求,服务器都会创建一个新的线程或者利用线程池复用去处理用户的一个请求,然后返回给用户结果,这样做在高并发的情况下会存在非常严重的性能问题:对于用户的每一次请求都创建一个新的线程是需要一定内存的,同时线程之间频繁的上下文切换也是一个很大的开销。nio编程的优势: 对于客户端的每一次请求到来时我们不再立即创建一个线程进行处理,相反,当一个事件准备就绪之后通过回调机制将描述符加入到阻塞队列中,只需要通过遍历阻塞队列对相应的事件进行处理就行了,通过这种回调机制整个过程都不需要对于每一个请求都去创建一个线程去单独处理。2打开eclipse,新建一个j**a项目,创建类niosocketdemopackage com.wangyh.nio;public class niosocketdemo { private selector selector;}3打开serversocketchannel,**客户端连接绑定**端口,设置连接为非阻塞模式public void initserver(int port) throws ioexception { serversocketchannel serverchannel = serversocketchannel.open(); serverchannel.configureblocking(false); serverchannel.socket().bind(new inetsocketaddress(port)); th**.selector=selector.open(); serverchannel.reg**ter(th**.selector, selectionkey.op_accept);}4创建reactor线程,创建多路复用器并启动线程将serversocketchannel注册到reactor线程中的selector上,**accept事件selector轮询准备就绪的keypublic void l**tenselector() throws ioexception { while (true) { int wait=th**.selector.select(); if(wait ==0)continue; iterator<?> iteratorkey = th**.selector.selectedkeys().iterator(); while (iteratorkey.hasnext()) { selectionkey selectionkey = (selectionkey) iteratorkey.next(); iteratorkey.remove(); handler(selectionkey); } }}4该信息未经授权抓取自百度经验5selector**到新的客户端接入,处理新的接入请求,完成tcp三次握手,简历物理链路设置客户端链路为非阻塞模式将新接入的客户端连接注册到reactor线程的selector上,**读操作,读取客户端发送的网络消息异步读取客户端消息到缓冲区对buffer编解码,处理半包消息,将解码成功的消息封装成task将应答消息编码为buffer,调用socketchannel的write将消息异步发送给客户端private void handler(selectionkey selectionkey) throws ioexception { bytebuffer bytebuffer = bytebuffer.allocate(102400); if (selectionkey.**acceptable()) { serversocketchannel server = (serversocketchannel) selectionkey. channel(); socketchannel channel = server.accept(); channel.configureblocking(false); channel.reg**ter(th**.selector, selectionkey.op_read);} else if (selectionkey.**readable()) {{ socketchannel channel = (socketchannel) selectionkey.channel(); bytebuffer buffer = bytebuffer.allocate(1024); int readdata = channel.read(buffer); if (readdata > 0) { bytebuffer.flip(); string msg = new string(buffer.array(), "gbk").trim(); system.out.println("服务端接受到消息:" + msg); } } }bytebuffer.clear();}6在测试 main方法里,新建类实例,启动**,接受客户端连接public static void main(string[] args) throws ioexception { niosocketdemo niosocketdemo = new niosocketdemo(); niosocketdemo.initserver(8888); niosocketdemo.l**tenselector();}7程序启动后,会**8888端口,可用用telnet ip port方式,检测是否能连接,或者新建一个客户端程序,发送消息测试。end 20210311
汇率兑换计算器

类似问答
  • 期货程序化交易源代码怎么编程?
    • 2024-06-17 20:55:35
    • 提问者: 未知
    您好,程序化交易源代码的编程是根据人工的思路用软件上的语言编写的自动交易程序,每个软件上的编写程序都有用法说明的,或者您请人为你写程序也可以。祝您生活愉快!
  • 前端代码,后端代码
    • 2024-06-17 21:04:07
    • 提问者: 未知
    指申购费,前端是买时就收,后端是卖时才收,够一定年限就不收了.
  • 森创ms0040a伺服驱动器报警代码显示e pe是什么故障?
    • 2024-06-17 20:27:50
    • 提问者: 未知
    1.这个是接地故障,监测到电流有一相对地!2、一般是电流传感器故障导致的,也有可能是电机绝缘破坏或者电机线破皮导致!
  • epoll编程,如何实现高并发服务器开发?
    • 2024-06-17 22:35:40
    • 提问者: 未知
    1、本系统处理的业务为多客户端接入,一旦接入基本超过8个小时的长连接,但是登陆以后客户端基本不怎么活…
  • 联想 ibm x86服务器交易只是低端服务器吗
    • 2024-06-17 07:35:28
    • 提问者: 未知
    lenovo 收购包括 system x 机架和塔式服务器、采用英特尔® 至强™ 处理器的 x86 bladecenter 和 x86 flex system 刀片服务器和集成系统1-以及相关软件、交换和维护运营。ibm 将保留 system z 大型机、power systems、storage、基于 power 的 flex 服务器以及 pureapplication 和 puredata ....
  • 基金前端交易代码和后端交易代码的意义?
    • 2024-06-17 02:38:38
    • 提问者: 未知
    基金前端交易代码和后端交易代码的意思是在网上申购时输入前端交易代码,就先扣申购费。输入后端交易代码就暂不扣申购费,赎回时和赎回费一起扣。在实际的运作当中,开放式基金申购费的收取方式有两种,一种作为前端收费,另一种作为后端收费。前端收费是指当认购、申购基金时就需支付认/申购费的付费方式。扩展资料:如果基金在交易日(周一至周五的股市开盘时间)买的,一般会在t+2(t为购买基金的交易日,+2就是在购买当...
  • 有必要使用服务器端渲染(ssr)吗?
    • 2024-06-17 07:22:47
    • 提问者: 未知
    前阵子有搞了 react 服务端渲染的项目,主要还是看场景吧,适用于大家常说的 seo 和首屏渲染这些,一般都…
  • 如何架设股票代理服务器?
    • 2024-06-17 20:58:03
    • 提问者: 未知
    ccproxy
  • 增量编码器和绝对值编码器的区别及应用场合?
    • 2024-06-17 02:37:12
    • 提问者: 未知
    增量式编码2113器定义 增量式编码器是直接利用光电转换5261原理输出三组方波4102脉冲a、b和z相;a、b两组脉1653冲相位差90度,从而可方便的判断出旋转方向,而z相为每转一个脉冲,用于基准点定位。增量式编码器的特点 1、体积小,精密,本身分辨度可以很高,无接触无磨损、构造很简单。2、...
  • 编程中的源代码是什么?
    • 2024-06-17 05:52:48
    • 提问者: 未知
    源代码(bai也称源程序)是指未编译du的按照一zhi定的程序设计语言规dao范书写的文本文专件,是一系列人类可读的计算属机语言指令。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。