可视化通信服务器
承接上次的内容,解决上次的遗留问题
1.我们要实现多线程(一个线程一个Socket对象,从而实现多个客户端可同时与服务器建立连接)
while(true){
try {
Socket client = ss.accept();
System.out.println("已连接");
s=new Send(client,jf);
s.start();
} catch (IOException e) {
e.printStackTrace();
}
}
2.服务器可视化
简单地说我们在服务器窗体上添加两个文本框,一个用于显示接收到的消息,一个用于编辑要发送
的消息,有发送按钮,端口按钮,用于显示用户的列表等。这些都比较简单,我重点说一下用户列表
//在窗体西边添加面板
jp_west=new JPanel();
this.add(jp_west,BorderLayout.WEST);
//实例化一个JTable对象,并设置它的模式
table_user=new JTable();
//ClientList.getAllThread()取得在线用户链表,以链表形式返回
List<Send> sts=ClientList.getAllThread();
//创建UserTableMode类继承TableMode接口,实现接口中的方法即可
UserTableMode utm=new UserTableMode(sts);
table_user.setModel(utm);
//给JTable对象加滚动条
JScrollPane jsp=new JScrollPane(table_user);
jsp.setAutoscrolls(true);
table_user.setPreferredScrollableViewportSize(new Dimension(150,300));
jp_west.add(jsp);
//给表格加弹出菜单(实现)
JPopupMenu pop=this.getTablePopup();
table_user.setComponentPopupMenu(pop);
3.凭借用户名密码登陆
当服务器和客户端连接成功以后,服务器向客户端发送消息"欢迎您来到瑞鸿聊天室!请输入用户名:",
客户端将用户名写入,服务器向客户端发送消息userName+",请输入您的密码:",在客户端输入密码后,
实例化用户对象,设置用户名、密码等属性;然后对用户名进行认证,认证成功后,将该用户所在线程加入到
在线用户链表。
public void receive(Socket client){
try {
InputStream is=client.getInputStream();
InputStreamReader inr=new InputStreamReader(is);
BufferedReader bin=new BufferedReader(inr);
this.sendMessage("欢迎您来到瑞鸿聊天室!请输入用户名:");
String userName=bin.readLine();
this.sendMessage(userName+",请输入您的密码:");
String password=bin.readLine();
user=new User();
user.setUserName(userName);
user.setPassword(password);
//取得用户登录状态(true/false)
boolean loginstate=Check.checkLogin(user);
if(!loginstate)
this.sendMessage("认证失败!");
//认证正确后将该用户所在的线程加入到用户在线链表
ClientList.addClient(this);
st = bin.readLine();
while(true){
ClientList.CastMessage(this.user, st);
//将cmd上的内容打印到窗体上
db.text1.append(this.user.getUserName()+" : "+st+"\r\n");
//读取一个文本行
st = bin.readLine();
}
} catch (IOException e) {
e.printStackTrace();
closeMe();
}
}
//关闭这个线程处理对象
public void closeMe(){
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
4.ClientList中的一些比较好玩的方法
/**
*将该线程加入到在线用户链表
*/
public static void addClient(Send s){
list.add(s);
CastMessage(s.getUser()," 上线了!在线人数:"+list.size()+"\r\n");
SwingUtilities.updateComponentTreeUI(DrawBorder.table_user);
}
//群发消息msg为消息的内容
public static void CastMessage(User user,String msg){
msg=user.getUserName()+msg;
for(int i=0;i<list.size();i++){
Send s=list.get(i);
s.sendMessage(msg);
}
}
//移除所有
public static void removeAll(){
for(int i=0;i<list.size();i++){
Send s=list.get(i);
s.sendMessage("系统即将关闭!");
s.closeMe();
list.remove(i);
s=null;
}
}
public static void removeOne(User user){
for(int i=0;i<list.size();i++){
Send s=list.get(i);
if(s.getUser().getUserName().equals(user.getUserName())){
list.remove(i);
s.closeMe();
s=null;
CastMessage(user,"我下线了!");
}
}
}
/**
* 根据索引移除指定位置的处理线程对象,界面踢人是调用
* @param index:索引
*/
public static void removeUser(int index){
list.remove(index).closeMe();
}
/**
* 给队列中的某个用户发送消息
* @param index
* @param msg
*/
public static void sendmessage2(int index,String msg){
list.get(index).sendMessage(msg);
}
5.认证用户名
public class Check {
private static Map<String,User> UserDB=new HashMap();
static{//先于任何方法前执行,相当于注册
User user=new User();
user.setUserName("孙瑞鸿");
user.setPassword("123456");
UserDB.put(user.getUserName(), user);
}
//判断登录状态
public static boolean checkLogin(User user){
if(UserDB.containsKey(user.getUserName())){
return true;
}
return false;
}
}
小结:对于优化的服务器我认为应该有这几个类:DrawBorder(窗体类)、DrawListener(按钮监听器)、 Send(线程类)、Check(认证检查类)、User(用户信息类)、UserTableMode(在线用户链表模式类)、Client(用户链表类)等。
具体思路:
1.给窗体上的按钮加监听器
2.触发相应的事件,启动按钮:启动线程
发送按钮:发送消息时点击(调用send方法)
3.线程启动后,即可接收消息(调用receive方法,如上)
我觉得以上即为可视化服务器的主体,其余的一些类/方法,是为了优化服务器而定义的,可以参
考一下 。这样一个可视化的服务器就已经实现好了,动手试一下吧!
分享到:
相关推荐
服务器请求可视化工具是一种高效且直观的软件应用,它专门设计用于帮助用户监控和理解服务器接收的各种请求。在IT行业中,这种工具对于系统管理员、开发者以及性能优化专家来说是至关重要的,因为它提供了对服务器...
可视化的MFC的CS模式的程序,服务器端,C源码。
1. **简化通信:** 由于CoDeSys的集成可视化功能无需使用标识符表格,它能够直接访问控制器中的变量,从而简化了通信流程。 2. **减少工程投入:** 集成可视化省去了通常复杂的OPC(OLE for Process Control)层或DDE...
在实际应用中,这款可视化的远程登录工具可以广泛应用于各种场景,如数据中心的远程管理、远程协助、云服务器运维等。无论是个人用户还是企业,都可以通过它提高工作效率,减少物理出行,实现远程工作的无缝对接。 ...
3. **项目结构**:这个可视化平台可能包含一个后端服务器,负责处理用户请求,与数据库交互,以及与Scrapy进程通信;一个前端应用,提供用户界面;以及可能的一个数据库,用于存储爬虫配置、日志和其他相关信息。 4...
例如,它可以与后端服务器通信,获取最新的机房环境数据,如温度、湿度、电力消耗等,并利用库如D3.js、ECharts或Highcharts等创建动态图表,实时展示这些数据的变化。同时,JavaScript还可以实现用户交互,如点击...
而`redis-desktop-manager`是一个专为Redis设计的可视化管理工具,它为开发者提供了在图形用户界面(GUI)中操作Redis数据库的便利。这个工具使得管理Redis数据库变得直观且易于上手,尤其对于初学者和需要频繁进行...
本文将详细介绍一个专为HBase设计的可视化客户端工具,该工具不依赖于Phoenix连接,而是直接与HBase服务器通信,支持Hbase 1.x版本,提供类似于PL/SQL的友好界面,使得数据管理和查询变得更加便捷。 首先,这个可视...
Windows上的IPMI可视化管理工具是针对这种需求而设计的,提供了图形化的用户界面,使得管理远程服务器变得更加直观和便捷。 【IPMI基础】 IPMI由一个名为BMC(Baseboard Management Controller)的特殊微控制器实现...
该项目是关于利用Python进行网络爬虫,从51job网站获取相关数据,然后通过Echarts进行数据可视化,并最终构建一个基于Web的可视化大屏展示。在这个过程中,涉及到的关键技术包括Python爬虫、数据库管理(MySQL)、...
在这个专题中,“数据可视化大屏-前后端数据交互”指的是在构建可视化大屏时,前端与后端如何有效地进行数据通信以实现动态展示和实时更新。 **一、前端数据可视化** 前端是用户与应用交互的界面,对于数据可视化...
"Windows性能Web可视化监控"工具就是为此目的设计的,它提供了一个直观的Web界面,使得用户可以远程监控和分析系统的各种性能指标。下面将详细介绍这个工具及其相关知识点。 首先,Windows性能数据的采集是通过...
在大屏可视化中,通常需要从服务器获取大量数据,使用JavaScript进行数据清洗、预处理和转换,以便适应各种图表库的需求。例如,使用JavaScript的Array和Object方法处理数据结构,或者使用lodash等工具库来简化数据...
在数据可视化中,JavaScript用于处理用户交互,动态更新图表,以及与服务器进行异步数据通信。 3. **前端框架**:这些源码可能使用了不同的前端框架,如React、Vue或Angular,它们简化了UI组件的构建,使开发者能够...
在本项目"java网络编程socket可视化"中,我们将探讨如何使用Java Socket API创建一个简单的服务器,以及与其交互的客户端应用,同时实现数据的可视化展示。 首先,我们需要理解Socket的工作原理。Socket是网络上的...
在本项目中,我们探索了一个基于Python的课程设计,它构建了一个实时温度可视化工具,利用了MQTT协议、emqx服务器、ESP8266微控制器以及PyQt5图形用户界面。下面将详细介绍这些关键组成部分及其相关知识。 首先,...
在数据可视化项目中,我们将用HTML来构建用户界面,并通过AJAX异步地从Node.js服务器获取数据,实现动态交互的数据展示。 项目中的文件可能包括以下几个部分: 1. **服务器端代码**:使用Node.js和Express编写,...
在这个H5源码包中,JavaScript的运用至关重要,因为它是实现大数据可视化的主力,可以与服务器通信,处理数据,以及创建丰富的用户界面。 H5,即HTML5,是HTML的最新版本,增加了许多新特性,如离线存储、拖放功能...
这可能涉及到JavaScript或jQuery等脚本语言的运用,它们可以与服务器通信,获取实时数据,并在地图上动态显示。例如,当新的销售数据到来时,地图上的对应区域会自动高亮或者用特定的颜色表示。 此外,地图数据可视...