编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

hprose for java源码分析-16 服务器启动

wxchong 2024-10-30 04:30:48 开源技术 53 ℃ 0 评论

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()如何完成接收数据的工作。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表