网站首页 > 开源技术 正文
16.1 服务器启动方式
书接上回。为了了解服务器是如何接收数据的,需要先看下服务器的启动过程。
上图所示。方法startServer()启动服务器。
23行,生成 HproseTcpServer实例, 这个实例代表服务器。
24行,设置ReactorGroup中分配多少Reactor,即需要多少个线程来处理Channel上的消息。
25行,增加一个服务器方法 hello,客户端发送的rpc调用,最终会由这个方法来处理。
可以增加多个方法。目前客户端只调用了hello方法,以此作为示例。
26行,允许调试。服务器运行出现错误时,会有错误信息返回到客户端。
27行,启动服务器。启动后,服务器在4321端口监听。监听到客户端连接进来后,接受该连接,并且处理该连接上的数据发送,数据接收。
16.2 服务器启动细节
server.start()方法如下:
方法内生成一个Acceptor实例,并且将IP,端口,连接回调,处理线程数传入构造,然后启动。
Acceptor负责监听,并且将连接进来的Channel放到某个处理线程内。
在Acceptor构造方法中,做了几件准备工作:
1.生成一个Selector实例。
2.生成ServerSocketChannel实例 serverChannel,
设置其为非阻塞模式,绑定端口,将其注册到Selector中,开始选择OP_ACCEPT操作。
3.生成ReactorGroup实例。这个实例作用均衡各Reactor上要处理的Channel的数量。
4.设置回调handler。
调用acceptor.start()方法后,服务器就启动了,其实是生成了几个线程,如监听线程,Reactor线程。
监听线程:
监听线程中启动了reactor线程,并且开始了线程循环。
当有客户端连接进来后,会调到
accept方法内,接受一个连接channel,设置该channel为非阻塞模式,并且生成一个Connection包装实例,将其注册到reactor中。而reactor.register内部,则会选择一个Reactor,将其投入。
Reactor类register方法如下:
将连接投入队列connQueue中,然后唤醒selector(关于Reactor类,在客户端连接中,已有介绍)
投入队列connQueue后,在Reactor的process方法中,取出,最终调到Connection类方法
方法中,将channel注册到selector中,设置检测事件为OP_READ,即此时关心读事件。
设置完成后,通知服务器一个客户端已连接。
随后就开始了Reactor的处理循环:
dispatch()方法中,开始selector遍历。若检测到事件 OP_READ,则调用
conn.receive(),而这个方法,就是服务器接收数据的关键。
服务器,客户端公用类Connection,进行发送,接收数据。
上回中,客户端通过Connection发送了数据。接下来就站在服务器的角度来看,conn.receive()如何完成接收数据的工作。
猜你喜欢
- 2024-10-30 常见的Socket网络异常场景分析(socket异常连接怎么重置)
- 2024-10-30 JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解
- 2024-10-30 一文读懂CPU的层次结构(cpu的结构与原理)
- 2024-10-30 网络安全学习(5) - hping3 学习(hunter网络安全)
- 2024-10-30 一文读懂如何查看网络的性能指标(如何查看网络强度)
- 2024-10-30 如何使用网上公开的exp(如何使用网上邻居)
- 2024-10-30 C++ Socket 编程(c++ socket教程)
- 2024-10-30 FM2+ APU 最后逆袭,搭载 USB3.1 技嘉 F2A88XM-D3HP
- 2024-10-30 得力DM34ADN国产打印机在银河麒麟系统上安装和设置的方法
- 2024-10-30 Shopee新品爆品 | Shopee总下载量全球购物类APP第一
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)