可视化通信服务器

[size=x-large]可视化通信服务器[/size]
承接上次的内容,解决上次的遗留问题
[size=large]1.我们要实现多线程[/size](一个线程一个Socket对象,从而实现多个客户端可同时与服务器建立连接)
while(true){	
try {
Socket client = ss.accept();
System.out.println("已连接");
s=new Send(client,jf);
s.start();
} catch (IOException e) {
e.printStackTrace();
}
}

[size=large]2.服务器可视化[/size]
简单地说我们在服务器窗体上添加两个文本框,一个用于显示接收到的消息,一个用于编辑要发送
的消息,有发送按钮,端口按钮,用于显示用户的列表等。这些都比较简单,我重点说一下用户列表

//在窗体西边添加面板
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);

[size=large]3.凭借用户名密码登陆[/size]
当服务器和客户端连接成功以后,服务器向客户端发送消息"欢迎您来到瑞鸿聊天室!请输入用户名:",
客户端将用户名写入,服务器向客户端发送消息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();
}
}

[size=large]4.ClientList中的一些比较好玩的方法[/size]
/**
*将该线程加入到在线用户链表
*/
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);
}

[size=large]5.认证用户名[/size]
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方法,如上)
我觉得以上即为可视化服务器的主体,其余的一些类/方法,是为了优化服务器而定义的,可以参
考一下 。这样一个可视化的服务器就已经实现好了,动手试一下吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值