📄 serverframe.java
字号:
public ClientEchoThread(Socket s)
{ // ClientEchoThread线程类的构造器
socket = s;
try
{
ps = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()))); // 存储客户socket输入流,接收发送的信息
dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 存储客户socket输出流,向客户发送信息
String info = dis.readLine(); // 读取接收的信息
StringTokenizer stinfo = new StringTokenizer(info, ":"); // 用读取“:”分段字符
String head = stinfo.nextToken(); // 存储关键字的头信息
if(stinfo.hasMoreTokens())
name = stinfo.nextToken(); // 关键字后的第二段数据是客户名信息
if(stinfo.hasMoreTokens())
IP = stinfo.nextToken(); // 关键字后的第三段数据是客户IP信息
System.out.println(IP); // 在服务器控制台打印头信息
}
catch(IOException e)
{
System.out.println("Error:" + e);
}
} // end of ClientEchoThread constrator
public void run()
{ // 定义线程run()方法
while(true)
{
String line = null;
try
{
line = dis.readLine(); // 读客户端发送的数据流
}
catch(IOException e)
{
System.out.println("Error" + e);
ServerFrame.sendClients("SYSTEM:" + this.name + "离开聊天室!");
ServerFrame.disconnect(this);
ServerFrame.notifyRoom();
return;
}
if(line == null)
{ // 客户已离开
ServerFrame.sendClients("SYSTEM:" + this.name + "离开聊天室!");
ServerFrame.disconnect(this);
ServerFrame.notifyRoom();
return;
}
System.out.println(line);
StringTokenizer st = new StringTokenizer(line, ":");
String keyword = st.nextToken();
if(keyword.equals("QUIT"))
{
String s = "SYSTEM:" + this.name + "离开聊天室!"; // 关键字是QUIT则是客户端发来断开连接的信息
ServerFrame.sendClients(s);
ServerFrame.disconnect(this);
ServerFrame.notifyRoom(); // 继续监听聊天室并刷新其他客户聊天人名列表
return;
}
else if(keyword.equals("MSG"))
{
StringTokenizer stt = new StringTokenizer(st.nextToken(), "|");
keyword = stt.nextToken();
//System.out.println(keyword);
if(keyword.equals("public"))
{
ServerFrame.sendClients(line);
}
else
{
String sendToName = stt.nextToken();
//System.out.println(sendToName);
if(sendToName != null)
{
ServerFrame.findFromName(sendToName).send(line);
this.send(line);
}
}
}
else if(keyword.equals("NETMEETING_CONNECT_REQUEST"))
{
StringTokenizer peoplest = new StringTokenizer(st.nextToken(), "|");
int tokensCount = peoplest.countTokens();
String[] meetingPeople = new String[tokensCount];
for(int i = 0; i < tokensCount; i++)
{
meetingPeople[i] = peoplest.nextToken();
}
NetMeetingCheck nmc = new NetMeetingCheck(this, meetingPeople, this.name);
nmc.start();
}
else if(keyword.equals("NETMEETING_CONNECT_REVERT"))
{
this.netMeetingFlag = st.nextToken();
//this.netMeetingFlag.notifyAll();
}
else
{
try
{
ServerFrame.findFromName(st.nextToken()).send(line);
}catch(NullPointerException e)
{
System.out.println("没有聊天对象!");
JOptionPane.showMessageDialog(null,"没有聊天对象!");
}
}
}
}
} // end of class ClientEchoThread
class NetMeetingCheck extends Thread //处理NetMeeting请求
{
String[] names = null;
ClientEchoThread parent = null;
String applicant;
public NetMeetingCheck(ClientEchoThread p, String[] ns, String applicant)
{
names = ns;
parent = p;
this.applicant = applicant;
}
public void run()
{
for(int i = 0; i < names.length; i++)
{
ClientEchoThread c = ServerFrame.findFromName(names[i]);
if(c != parent) c.send("NETMEETING_CONNECT:" + applicant);
}
try
{
/*
for(int i = 0; i < names.length; i++)
{
ClientEchoThread c = ServerFrame.findFromName(names[i]);
synchronized (c.netMeetingFlag)
{
//while(c.netMeetingFlag == null)
//{
System.out.println("*******************");
c.netMeetingFlag.wait(); //等待对方应答
//}
}
}
*/
this.sleep(8000); //最大等待时间 8秒
}catch (InterruptedException e) {}
System.out.println("/////////////////////////////////");
String s = "NETMEETING_START:" + parent.name + "|";
for(int i = 0; i < names.length; i++)
{
ClientEchoThread c = ServerFrame.findFromName(names[i]);
if(c.netMeetingFlag.equals("accept")) s += c.name + "|";
}
for(int i = 0; i < names.length; i++)
{
ClientEchoThread c = ServerFrame.findFromName(names[i]);
if(c.netMeetingFlag.equals("accept")) c.send(s);
c.netMeetingFlag = "refuse";
}
this.suspend();
}
}
class chatServer_AboutBox extends JDialog implements ActionListener {
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel insetsPanel1 = new JPanel();
JPanel insetsPanel2 = new JPanel();
JPanel insetsPanel3 = new JPanel();
JButton button1 = new JButton();
JLabel imageLabel = new JLabel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
JLabel label3 = new JLabel();
JLabel label4 = new JLabel();
BorderLayout borderLayout1 = new BorderLayout();
BorderLayout borderLayout2 = new BorderLayout();
FlowLayout flowLayout1 = new FlowLayout();
GridLayout gridLayout1 = new GridLayout();
String product = "聊天服务器端";
String version = "1.0";
String copyright = "Copyright (c) 2004";
String comments = "聊天室服务器端实现多线程客户连接和显示连接信息";
public chatServer_AboutBox(Frame parent) {
super(parent);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
pack();
}
/**Component initialization*/
private void jbInit() throws Exception {
//imageLabel.setIcon(new ImageIcon(Frame1_AboutBox.class.getResource("[Your Image]")));
this.setTitle("About");
setResizable(false);
panel1.setLayout(borderLayout1);
panel2.setLayout(borderLayout2);
insetsPanel1.setLayout(flowLayout1);
insetsPanel2.setLayout(flowLayout1);
insetsPanel2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
gridLayout1.setRows(4);
gridLayout1.setColumns(1);
label1.setText(product);
label2.setText(version);
label3.setText(copyright);
label4.setText(comments);
insetsPanel3.setLayout(gridLayout1);
insetsPanel3.setBorder(BorderFactory.createEmptyBorder(10, 60, 10, 10));
button1.setText("Ok");
button1.addActionListener(this);
insetsPanel2.add(imageLabel, null);
panel2.add(insetsPanel2, BorderLayout.WEST);
this.getContentPane().add(panel1, null);
insetsPanel3.add(label1, null);
insetsPanel3.add(label2, null);
insetsPanel3.add(label3, null);
insetsPanel3.add(label4, null);
panel2.add(insetsPanel3, BorderLayout.CENTER);
insetsPanel1.add(button1, null);
panel1.add(insetsPanel1, BorderLayout.SOUTH);
panel1.add(panel2, BorderLayout.NORTH);
}
/**Overridden so we can exit when window is closed*/
protected void processWindowEvent(WindowEvent e) {
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
cancel();
}
super.processWindowEvent(e);
}
/**Close the dialog*/
void cancel() {
dispose();
}
/**Close the dialog on a button event*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
cancel();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -