课 程 设 计 报 告 书 专 用 纸
int i =0;
while( i < count){ Node node = userLinkList.findUser(i); node.input .close(); node.output.close();
node.socket.close();
i ++; }
stopServer .setEnabled(false); stopItem .setEnabled(false); startServer.setEnabled(true); startItem.setEnabled(true); portSet.setEnabled(true); portItem.setEnabled(true); sysMessage.setEnabled(false);
messageShow.append(\服务端已经关闭\\n\ combobox.removeAllItems();
combobox.addItem(\所有人\
}
catch(Exception e){ //System.out.println(e);
}
}
/**
* 向所有人发送服务器关闭的消息
*/
public void sendStopToAll(){ int count = userLinkList.getCount(); int i = 0; while(i < count){ Node node = userLinkList.findUser(i); if(node == null) { i ++; continue; } try{ node.output.writeObject(\服务关闭\
node.output.flush();
}
catch (Exception e){ //System.out.println(\
}
第 10 页 共 18 页
课 程 设 计 报 告 书 专 用 纸
i++;
}
} /**
* 向所有人发送消息 */
public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用户总数 int i = 0;
while(i < count){ Node node = userLinkList.findUser(i); if(node == null) {
i ++; continue; } try{ node.output.writeObject(\系统信息\ node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch (Exception e){
//System.out.println(\ }
i++;
}
sysMessage.setText(\
} /**
* 向客户端用户发送消息 */
public void sendSystemMessage(){ String toSomebody = combobox.getSelectedItem().toString(); String message = sysMessage.getText() + \ messageShow.append(message); //向所有人发送消息
if(toSomebody.equalsIgnoreCase(\所有人\ sendMsgToAll(message); }
else{ //向某个用户发送消息
Node node = userLinkList.findUser(toSomebody); try{
node.output.writeObject(\系统信息\
第 11 页 共 18 页
课 程 设 计 报 告 书 专 用 纸
}
node.output.flush();
node.output.writeObject(message); node.output.flush(); }
catch(Exception e){ }
sysMessage.setText(\将发送消息栏的消息清空
//System.out.println(\
} }
public static void main(String[] args) { }
ChatServer app = new ChatServer();
(2)ServerListen.java:该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
import javax.swing.event.*; import java.io.*; import java.net.*; /*
* 服务端的侦听类 */
public class ServerListen extends Thread {
this.server = server; ServerSocket server;
JComboBox combobox; JTextArea textarea;
JTextField textfield;
UserLinkList userLinkList;//用户链表 Node client;
ServerReceive recvThread;
public boolean isStop; /*
* 聊天服务端的用户上线于下线侦听类 */
public ServerListen(ServerSocket server,JComboBox combobox, JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
第 12 页 共 18 页
课 程 设 计 报 告 书 专 用 纸
}
public void run(){
while(!isStop && !server.isClosed()){ try{ client = new Node();
client.socket = server.accept(); client.output
=
new
this.combobox = combobox; this.textarea = textarea;
this.textfield = textfield;
this.userLinkList = userLinkList;
isStop = false;
ObjectOutputStream(client.socket.getOutputStream());
client.output.flush(); client.input ObjectInputStream(client.socket.getInputStream());
}
}
}
= new
client.username = (String)client.input.readObject();
//显示提示信息
combobox.addItem(client.username); userLinkList.addUser(client);
textarea.append(\用户 \上线\textfield.setText(\在线用户\+ userLinkList.getCount() + \人\\n\
recvThread = new ServerReceive(textarea,textfield, combobox,client,userLinkList);
recvThread.start(); }
catch(Exception e){ }
(3)ServerReceive.java:该类是实现服务器端的消息的收发的类。该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。
import javax.swing.*; import java.io.*; import java.net.*;
/*
* 服务器收发消息的类
*/
public class ServerReceive extends Thread {
第 13 页 共 18 页
课 程 设 计 报 告 书 专 用 纸
JTextArea textarea; JTextField textfield;
JComboBox combobox; Node client;
UserLinkList userLinkList;//用户链表 public boolean isStop;
public ServerReceive(JTextArea textarea,JTextField textfield, }
public void run(){
//向所有人发送用户的列表 sendUserList();
while(!isStop && !client.socket.isClosed()){
try{
String type = (String)client.input.readObject(); if(type.equalsIgnoreCase(\聊天信息\
String toSomebody = (String)client.input.readObject(); String status = (String)client.input.readObject();
JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea; this.textfield = textfield; this.client = client;
this.userLinkList = userLinkList; this.combobox = combobox;
isStop = false;
String action = (String)client.input.readObject(); String message = (String)client.input.readObject(); String msg = client.username +\
+ \对 \+ toSomebody + \说 : \+ message + \
if(status.equalsIgnoreCase(\悄悄话\ msg = \悄悄话] \}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase(\所有人\ sendToAll(msg);//向所有人发送消息 }
else{
第 14 页 共 18 页