我们还是先实现服务器端的功能。你可以先参考前面的描述的界面,先把界面设计好,由于比较简单,这里我就不讲解了。
一、实现服务器对应每个客户端的线程类。
在com.dao包中新建一个Server2ClientThread类,该类是服务器端类的核心功能,其实现思路与上一天所讲的差不多,也是每一个客户端就对应一个线程来维护,不同的是,服务器需要记录所有的在线用户和信息,而这些信息是所有的用户共享的,所以这里我们把这些变量定义为静态变量(static),这点要注意。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
二、实现服务器端的功能类。
我们把启动服务和关闭服务功能封装成为两个方法,在com.dao中新建类ServerStart。实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
三、绑定按钮事件。
接下我们绑定前台的启动按钮的单击事件,由于程序运行ServerSocket的accept()时会产生阻塞程序的效果,为了不影响界面程序的正常运行,所以我们需要把Socket服务的启动放入另外一个线程中,异步运行。
用户点击了启动后,同时会不断的刷新在线用户和最新聊天信息,所以这里我们有定义一个线程处理这个事情,每个500毫秒就读取保存在Server2ClientThread中的静态变量(保存了在线用户和最新聊天信息),以达到刷新界面的效果。
用户点击了启动后,按钮将会变成关闭。用户在此点击按钮就表示关闭服务。
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
好,我们的服务器端功能就完成了。