网络通信开发(二)

一、群聊服务器的实现基本功能

  • 当客户机连接服务器,服务器要求客户机输入用户名和密码
  • 当输入的用户名和密码与服务器所保存的账号一致登录成功,否则断开
  • 登录成功后,给其他客户机提示信息,显示在线人数
  • 登录成功的客户机可以给服务器发送消息,其他客户端也会收到消息
    实现基本流程
    网络通信开发(二)
    程序设计
    (一)服务器端
    1)ChatServer类:创建服务器并启动等待连接
    2)ServerThread类:处理Socket对象线程类,每连接一个客户机就创建一个线程
    3)DaoTools类:数据的访问和验证类,负责生成模拟数据并验证客户端账号
    4)ChatTools类:服务器辅助类,将客户机发送的消息转发给其他客户
    5)UserInfo类:用户数据模型,每一个UserInfo类对象存储一个用户的账号信息

代码实现:
https://github.com/zhenglimei/chatServer
效果展示:
网络通信开发(二)
小结:

  1. 程序中的阻塞机制
    阻塞是指当程序执行某行代码时会停止执行知道这行代码执行完毕,其中
    Socket client = server.accept();//等待客户机进入
    accept()方法会一直停住,直到有一个客户机连接进来 才会返回一个Socket对象。

另外一个阻塞的地方就是,从网络读取数据时,如以下代码:

//直接从InputStream中读取数据: int i=ins.read();//或将输入流ins封装为可以读取一行字符串,也就是以\r\n结尾的字符串 
BufferedReader brd=new BufferedReader(new InputStreamReader(ins)) 
String pwd=brd.readLine();

这里read()方法会阻塞直到读到一个字节:readLine()方法也会阻塞,直到客户端发送一个回车字符,才会将读取的字符串返回,对于会阻塞的代码,一般要放到独立的线程中执行,这样不致于阻塞其他方法的调用
2. 内存泄露问题
Java虽然有GC机制,但是也会存在内存泄露的问题,在这个案例中,每登录一个客户机就将对应的ServerThread对象放入ChatTools队列中,这样随着对象的增加,服务器就可能会奔溃。

二、群聊客户端实现

网络通信开发(二)
效果展示:
网络通信开发(二)
网络通信开发(二)
网络通信开发(二)
[详细代码] (https://github.com/zhenglimei/chatServer)