【Java】JavaSocket编程开发聊天室-服务器端部分
Server服务器端.
服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机(如PC机、智能手机、ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务。服务器具有高速的CPU运算能力、长时间的可靠运行、强大的I/O外部数据吞吐能力以及更好的扩展性。根据服务器所提供的服务,一般来说服务器都具备承担响应服务请求、承担服务、保障服务的能力。服务器作为电子设备,其内部的结构十分的复杂,但与普通的计算机内部结构相差不大,如:cpu、硬盘、内存,系统、系统总线等。
ServerLauncher.
ServerLauncher是管理员看到的服务器端界面的启动器,当管理员运行ServerLauncher时,有启动一个进程来对于从属性文件中预先配置的端口号到达的用户进行监听,对应于每一个到达的用户,都启动一个对应的进程为其服务。
int ServerPort = Integer.parseInt(getProperty("Port"));
serverSocket = new ServerSocket(ServerPort);Socket socket = serverSocket.accept();//Create a new thread.
new Thread(socket).start();
并且在ServerLauncher中也对整个服务器端的UI风格进行了设置,同样使用了Java独特的跨平台界面风格:
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());//Display server UI.
new ServerUI()
ServerUI.
ServerUI是表示管理员实际上看到的图形界面的类,其中包括了在线用户列表、已注册用户列表的显示、管理员广播功能、管理员私聊用户功能以及管理员强制用户下线功能的控件与实现。最终的GUI界面如下所示,并且我们从GUI入手,逐步讲述功能以及有关控件的实现细节:
管理员广播功能
这一功能其实并不是很复杂,它和某一个用户在群聊中发送消息并没有什么不同,只不过现在这一"用户"的身份比较特殊,它代表了聊天室系统本身。获取了ServerUI界面上管理员编辑完成的广播消息内容之后,服务器端就向每一个客户端发送一个标记为【广播】回复,而客户端对于这样的消息处理和标记为【聊天】的消息处理并没有不同,只需要显示在用户看到的界面上即可。下面我们给出展示逻辑的代码,以及广播功能的展示:
//Special user:system.
ADT_of_User system = new ADT_of_User(8888,"system");//Set sender with system.
Message message = new Message();
message.setSender(system);//Mark reply with 'BROADCAST'.
reply.setType(ReplyType.BROADCAST);//Reply to every client.
SendReplyOfficial(ServerDataStore.OnlineInfoMap.get(ID),reply);
两个在线的用户显然都收到了来自System的信息"We are under attack".
JTabbedPane的使用
选项卡面板是指ServerUI右侧那块,根据管理员的选择呈现出不同内容的部分:
如上图所示,分别能够显示出OnlineUsers以及RegisteredUsers,选项卡面板的代码部分如下所示(注意其中的变量OnlineUsers和RegisteredUsers都已继承自AbstractTableModel的类的实例化,所以能够基于它们构造出JTable类型的变量供后续的addTab操作):
//Create a JTabbedPane.
JTabbedPane TabbedPane = new JTabbedPane();//Get online users and registered users's data,and convert to JTable.
OnlineUsersTable = new JTable(OnlineUsers);
RegistedUsersTable = new JTable(RegisteredUsers);//Add tab.
TabbedPane.addTab("OnlineUsersList", new JScrollPane(OnlineUsersTable));
TabbedPane.addTab("RegistedUsersList", new JScrollPane(RegistedUsersTable));
JPopupMenu的使用
顾名思义,这是一种弹出式的菜单,能够提供一些自定义的功能,在ServerUI的界面上,管理员能够选择某一个在线用户,进行【私聊】或者【强制下线】操作。
前面我们以及说过,此处JTabbedPane中的选项卡中的元素都是JTable类型的,并且其中实际的数据也是早已保存在服务器端的,所以剩下的问题就是,如何在JTable类型上添加进弹出式的菜单呢?我们只需要创建一个JPopupMenu,向其中加入绑定了对应动作的JMenuItem,最后再将JPopupMenu添加到JTable中即可,是一个层层包含的关系。
//Create JPopupMenu and JMenuItem respectfully.
JPopupMenu PopupMenu = new JPopupMenu();
JMenuItem SendItem = new JMenuItem("SendMessage");
JMenuItem KickOutItem = new JMenuItem("KickOut");//Set command for distinguish.
SendItem.setActionCommand("SendMessage");
KickOutItem.setActionCommand("KickOut");//Create ActionListener.
ActionListener Do = new ActionListener()
{@Overridepublic void actionPerformed(ActionEvent e){//Get command.String command = e.getActionCommand();//Conduct differet action via difference between commands.ConductCommand(command);}
};//Add actionListener
SendItem.addActionListener(Do);
KickOutItem.addActionListener(Do);//Add menu item into popup menu.
PopupMenu.add(SendItem);
PopupMenu.add(KickOutItem);//Add popup menu into table.
OnlineUsersTable.setComponentPopupMenu(PopupMenu);
管理员私聊功能
这一功能和前面叙述过的聊天室中群聊消息的发送、管理员广播功能的实现大同小异。只不过现在的用户是特殊的用户’System’,原理还是服务器端获得了被私聊用户的ID以后,向其发送一个标记为【聊天】的回复,后续该用户的客户端像对待普通消息那样处理这一回复。
//Create user 'System'
ADT_of_User system = new ADT_of_User(8888,"system");
Message message = new Message();//Set sender and receiver.
message.setSender(system);
message.setReceiver(ThatUser);//Mark reply with 'CHAT'.
Reply reply = new Reply();
reply.setType(ReplyType.CHAT);//Reply to receiver.
ServerRecordClient receiver = get(message.getReceiver().getID());
SendReply(receiver,reply);
作为测试,我们让管理员System给Hoe发送了一条系统通知,只有Hoe能看到这条消息,在线的其他用户是无法看到的。
Hoe的确收到了这条消息,而Mega的界面中没有这条消息:
管理员强制下线功能
强制下线功能只需要服务器向被选中用户的客户端发送一个标记为【退出】的回复,客户端收到这样的回复之后,就会自动关闭,从而完成了管理员强制下线的功能。
//Create user 'System'
ADT_of_User system = new ADT_of_User(8888,"system");
Message message = new Message();//Set sender and receiver.
message.setSender(system);
message.setReceiver(KickedUser);//Mark reply with 'KICK_OUT'.
Reply reply = new Reply();
reply.setType(ReplyType.KICK_OUT);//Reply to receiver.
ServerRecordClient receiver = get(message.getReceiver().getID());
SendReply(receiver,reply);
我们让管理员向Mega执行强制下线功能,结果如下所示:
【Java】JavaSocket编程开发聊天室-服务器端部分相关推荐
- 视频教程-基于Java的WebSocket的聊天室-Java
基于Java的WebSocket的聊天室 多年 Java 企业级应用开发工作经验,曾参与中国人寿.华夏人寿.泰康人寿.信达财险等保险行业内部业务管理系统以及线上在线产品的开发:参与中国人民银行.清华大 ...
- 局域网服务器发送消息,Java实现简单局域网聊天室
本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方 ...
- windows网络编程 --网络聊天室(2)
文章目录 IOCP模型 常用IOCP函数 基于IOCP的网络聊天室 服务器端 客户端 IOCP模型 IOCP :输入输出完成端口. 是支持多个同时发生的异步I/O操作的应用程序编程接口,IOCP特别适 ...
- windows网络编程 ---网络聊天室(1)
文章目录 一个简单的网络聊天室 服务器端 代码 客户端 代码 一个简单的网络聊天室 运行如下: 只是实现了一个简单的通信功能,下一节我们再来讨论的IO/CP模型 服务器端 初始化网络环境 int WS ...
- Java中文编程开发,让Java编写更加容易
Java中文编程开发,让Java编写更加容易 目录 创建Java项目 创建类 编写方法 调用方法 Tips:文件必须以UTF-8格式保存才能够运行 1.创建Java项目 项目创建完成后,创建一个资源包 ...
- Python用tornado的websocket开发聊天室
Python用tornado的websocket开发聊天室 用tornado开发基于异步websocket聊天室-demo 目录结构 Python包 main.py app/views.py temp ...
- java实现多人聊天室+私聊+Derby数据库
java实现多人聊天室+私聊+Derby数据库(没有实现注册功能) 这个聊天室困扰了我好久好久,一步一步的修改,终于不负我的努力啊,可算完成了,对于一个初学java的来说,完成第一个比较完整的项目,也 ...
- 基于JavaSwing开发聊天室(QQ聊天 群聊)系统+论文+PPT 大作业 毕业设计项目源码
基于JavaSwing开发聊天室(QQ聊天 群聊)系统+论文+PPT(毕业设计/大作业) 开发环境: Windows操作系统 开发工具: Eclipse/Myeclipse+Jdk 演示视频: jav ...
- Java+Springboot+Websocket在线聊天室
1.什么是websocket? websocket是由HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯.它是一种在单个TCP连接上进行全双工通信的协议.W ...
- java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...
完成效果如下 客户端: 服务器端: 客户端功能: 输入服务器对应的端口,IP号,用户名(昵称),可以互相发送消息 服务器端功能: 输入端口号,启动,可以向所有客户端发送消息,IP地址自动获取. 下面是 ...
最新文章
- Citrix Avalon安装实验手册之一----Avalon概述及实验环境准备
- Python的零基础超详细讲解(第一天)-Python简介以及下载
- 联合国2019数字经济报告
- 把Array说透(续一)
- PostgreSQL 无会话、有会话模式 - 客服平均响应速度(RT)实时计算实践(窗口查询\流计算)...
- [BetterExplained]书写是为了更好的思考
- C#——Ellipse(椭圆)类[继承Circle(圆)类][实现IComparable接口、IComparerrT接口]DEMO
- 拦截器---SpringMVC(权限拦截)
- 爬虫:利用cookie获取人人网登录后网页信息
- ireport 无法打开问题
- 微软研究院研究员Ryan Beckett 博士论文《Network Control Plane Synthesis and Verification》下载—2018ACM最佳博士论文题目奖
- android设置存储,在android应用程序中存储用户设置的最合适方法是什么?
- 【Node】—系统模块
- Struts2架构流程
- 基于SpringBoot 学生成绩管理系统的设计与实现
- php四级联动,二级联动 三级联动 四级联动 多级联动
- 科技资讯杂志 科技资讯杂志社科技资讯编辑部2022年第17期目录
- python中abs和fabs的区别_Python - abs vs fabs
- 2021年秋招面经分享·地平线【芯片设计研发工程师】
- 仿win10系统UI界面纯html网页网站后台UI界面