06 java GUI 网络编程:图形界面聊天室

您所在的位置:网站首页 javafx图形界面 06 java GUI 网络编程:图形界面聊天室

06 java GUI 网络编程:图形界面聊天室

2023-09-05 10:50| 来源: 网络整理| 查看: 265

仿照第4篇笔记的形式,笔者决定将GUI和网络编程部分用综合练习的方式来总结。练习项目是有图形界面的聊天室,用到了GUI中的javax.swing包和网络编程中的TCP/socket编程。GUI部分的难点是图形控件的API较为复杂,设置不同属性需要很多的方法和字段,需要参考API手册和网上的一些图形界面作品的代码,不过GUI代码的结构较为固定(相对于聊天室简单的界面而言),容易总结固定格式。网络编程部分的难点是聊天室涉及到多客户端之间通过服务器的通信,不仅服务器要使用多线程,而且每个服务线程都要求能够调取其它服务线程中的socket以便向其它客户端传递消息,这就需要专门的数据容器来储存所有服务线程。网络编程部分的另一个难点是消息的结构设计。由于一个socket只有一对输入输出流,来自客户端和服务器的各种不同类型消息都要通过这对流来传递给对方,所以服务器和客户端都要能根据消息的类型采取不同的动作。这需要仔细考虑消息的形式、结构和解析方法。

编程用了两天时间,下面简要介绍下实现的功能,GUI和网络编程部分的思路,详细说明可以见最后的代码和注释。

1. 实现功能 作为聊天室软件实现了: (1)可显示并即时更新当前在线列表。当新的客户端连接上服务器,或者在线的客户端退出时,客户端向服务器发送消息,服务器会立刻更新所有客户端的在线列表。在线列表显示当前在线者(不包括自己)的网名、IP和端口; (2)发送消息时用户从在线列表中选择消息接收者,数量从一个人到所有人皆可; (3)接收消息时显示发送者IP和端口; (4)与服务器失去连接时可以在聊天窗口显示异常信息; (5)服务器用多线程方式工作,有静态容器存储所有服务线程。 2. GUI部分概要 只有客户端需要图形界面。这个界面具有: (1)聊天窗口:显示自己发送的和收到的信息(包括发信人身份),用设置成不可编辑的JTextArea控件实现,用JScrollPane控件包装来实现滚动条; (2)打字窗口:输入聊天消息,用设置成可编辑的JTextArea控件实现; (3)当前在线列表:显示当前在线的所有人的网名,IP和端口,由服务器即时更新。发送聊天消息时需要在表中选择消息接收人,从一个人到所有人皆可。用JTable控件实现,被服务器更新时可动态插入或删除行。用JScrollPane控件包装来实现滚动条; (4)发送按钮:将打字窗口中的文字按照在线列表中选择的收信人发给服务器,由后者转发给收信人,随即将打字窗口清屏,用JButton控件实现; (5)清屏按钮:将聊天窗口清屏,用JButton控件实现; (6)退出按钮:向服务器发出退出消息,关闭此客户端程序。服务器接收到后更新所有客户端的当前在线列表; (7)收信人标签:与在线列表中选择的收信人一致,起提醒作用。若用户没有选择任何收信人,则不能发送聊天消息。 3. 网络编程部分概要 (1)使用TCP/Socket连接。服务器使用多线程工作,每个客户端都享有一个服务线程; (2)每个客户端用自己的IP地址和端口号组成一个字符串作为用户标识(uid) (3)客户端和服务器之间每次通信都是传递一个字符串,这个字符串可能有这几种结构:      Exit/                          客户端发往服务器,表示该客户端退出      Chat/收信人地址/聊天内容       客户端发往服务器,表示该客户端要对别的客户端发送聊天消息      Chat/发信人地址/聊天内容       服务器发往客户端,表示服务器转发给收信客户端的聊天消息      OnlineListUpdate/在线者地址    服务器发往客户端,表示有客户端加入或退出,要更新所有客户端的当前在线列表 (4)收信人地址,发信人地址,在线者地址字符串都采用以下形式:      第一个客户端IP地址:第一个客户端端口号,第二个客户端IP地址:第二个客户端端口号,.....      如果是发信人地址,则只有一个客户端IP地址和端口号 (5)服务器类有两个静态容器:     一个是String数组,用来储存当前在线的所有人的uid,     一个是HashTable, 存储所有服务线程,可以根据uid取出对应的服务线程     当客户端加入或退出时,先更新服务器中的这两个容器,添加或删除相应元素,再向客户端发消息更新其在线列表 (6)服务器用while(true)循环中持续监听客户端消息,根据消息类型作出反应。收到"Exit/"类型消息就向所有客户端发出"OnlineListUpdate/在线者地址"类型消息,     收到"Chat/收信人地址/聊天内容"类型消息就向收信客户端发出"Chat/发信人地址/聊天内容"类型消息; (7)客户端用while(true)循环中持续监听服务器消息,根据消息类型作出反应。收到"Chat/发信人地址/聊天内容"类型消息就在聊天窗口中显示发信人地址和聊天内容,     收到"OnlineListUpdate/在线者地址"类型消息更新在线列表控件显示新的在线列表; (8)服务器只有在收到客户端消息时才会发送消息; (9)客户端只有按发送或退出按钮时才会发送消息。 4. 功能示例 5. 服务器代码 import java.io.*; import java.util.*; import java.net.*; import java.text.*; public class Server { public static void main(String[] args) throws Exception { //建立服务器ServerSocket ServerSocket ss = new ServerSocket(10000); //提示Server建立成功 System.out.println("Server online... " + ss.getInetAddress().getLoca


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3