创建BIO多人聊天室

创建多人聊天室:

使用的是 阻塞式模型,这里只涉及多人聊天,不涉及 一对一聊天,使用了多线程.

 

接收数据时:要将换行符丢弃。

 2台以上设备如何交互数据?

1.约定一个基础的数据格式:使用回车换行符作为信息的截断。

2. 客户端 - 服务器  - 转发到 客户端 【三者及以上,用户1 发送信息到服务器,服务器遍历其他的客户端,将该消息通知到其他客户端上】

 

 

1.客户端:

首先使用 UDP 广播,获取 tcp 服务器的端口号和IP地址,

然后进行 tcp 的 客户端 和 服务器的连接

在 TCPClient 中 只有一个读线程,没有写线程()

写是在 client 类中进行的

2.对 tcp服务端 类的分析:

2.1 :  server类【充当一个窗口】: 负责 启动  TCPServer 和 UDPProvider 类,并且 将 从键盘传入的信息转发给 已连接的客户端。

2.2: TCPServer 类:

 

1.  start 函数:启动 对客户端进行监听的类:ClientListener

2.:  ClientListener【多线程类】:使用 do-while 循环 监听客户端的连接。

每有一个客户端连接,就构建一个异步线程ClientHandler。

 server.accept(); 是阻塞式的,即若没有客户端连接,就一直阻塞在这里

3 : ClientHandler:真正对客户端的消息的读写进行处理 :

首先明确的是:客户端的读写是分离的 ,互不干扰(即读一个线程,写一个线程)

这是一个读线程

但是 对于写线程来说【对客户端消息的转发】:(

这里没有让 ClientWriteHandler 继承 Thread , 是因为 继承了Thread,对于写线程来说, 大部分时间都在等待,

  但是实现该等待是比较复杂的,这涉及到了 多线程的协作问题,   所以就设置成了 单线程池)

 

服务器性能分析:

服务器需要GC回收 和主线程(这就两条了)

监听客户端的连接,

转发客户端信息也使用了一个单线程池

所以服务器的实际线程数量至少是:2n+4

进行了一下客户端压测:能承受1000个左右,消耗90多M的内存和50的cpu量

和2000多个线程

服务器优化:

猜你喜欢

转载自blog.csdn.net/weixin_42528855/article/details/106784442
今日推荐