📄 chatserver.java
字号:
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.TextArea;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
/*
*
*
*/
public class ChatServer extends Frame
{
final static int PORT = 1234; // Server Socket的监听端口
// TODO
// static int userCount = 0;
private Panel panel = null;
private static Label label = null;
static TextArea msgArea = null;
/**
* This method initializes panel
*
* @return java.awt.Panel
*/
private Panel getPanel()
{
if (panel == null)
{
label = new Label();
label.setBounds(new Rectangle(100, 4, 250, 24));
label.setFont(new Font("Dialog", Font.PLAIN, 16));
label.setText("服务器监视器");
panel = new Panel();
panel.setLayout(null);
panel.setBounds(new Rectangle(4, 32, 408, 213));
panel.add(label, null);
panel.add(getTextArea(), null);
}
return panel;
}
/**
* This method initializes textArea
*
* @return java.awt.TextArea
*/
private TextArea getTextArea()
{
if (msgArea == null)
{
msgArea = new TextArea();
msgArea.setBounds(new Rectangle(8, 28, 391, 172));
msgArea.setEditable(false);
}
return msgArea;
}
public ChatServer()
{
super();
this.setLayout(null);
this.setSize(418, 251);
this.setTitle("聊天室服务器监视器");
this.setVisible(true);
this.add(getPanel(), null);
this.setResizable(false);
this.addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(java.awt.event.WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String args[])
{
ServerSocket server = null;
Socket user = null; // 对于一个用户会启动一个服务线程
Hashtable userList = new Hashtable(); // 保存用户列表
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e)
{
e.printStackTrace();
}
ChatServer myserver = new ChatServer(); // 实例化一个chatServer类
msgArea.append("Server starting ...\n");
try
{
server = new ServerSocket(PORT);// 设置监听端口
if (server != null)
{
msgArea
.append("The server is listening on port " + PORT
+ "\n");
}
} catch (IOException e)
{
// TODO 自动生成 catch 块
// e.printStackTrace();
JOptionPane.showMessageDialog(null, "Socket连接失败", "服务器运行错误",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
while (true)
{
try
{
user = server.accept();// 服务器接到一个用户的socket请求
} catch (IOException e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
if (user != null)
{
InetAddress address = user.getInetAddress(); // 获取用户的IP地址
// 启动一个服务线程为该用户服务
ServerThreadForUser userThread = new ServerThreadForUser(user,
userList, address, msgArea);
userThread.start();
} else
// 异常情况
{
msgArea.append("Error in accept user!\n");
continue;
}
}
}
}
/*
* 该线程接收用户端socket的信息并反馈
*
*/
class ServerThreadForUser extends Thread
{
String name = null, nickName = null;
Socket socket = null;
File file = null;
DataOutputStream out = null;
DataInputStream in = null;
Hashtable userList = null;
TextArea msgArea = null;
InetAddress address = null;
ServerThreadForUser(Socket userSocket, Hashtable list, InetAddress address,
TextArea msgArea)
{
userList = list;
socket = userSocket;
this.address = address;
this.msgArea = msgArea;
try
{
in = new DataInputStream(socket.getInputStream());// 用户socket写入
out = new DataOutputStream(socket.getOutputStream()); //
} catch (IOException e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run()
{
while (true)
{
String info = null;
try
{
info = in.readUTF();
if (info.startsWith("姓名:"))
{
name = info.substring(info.indexOf(":") + 1, info
.indexOf("昵称"));
nickName = info.substring(info.lastIndexOf(":") + 1);
if (userList.containsKey(name) == false) // 用户名不可重名
{
msgArea.append("用户:" + name + " 进入聊天室(IP:" + address
+ ")\n");
userList.put(name, this); // 可以聊天,加入user list
out.writeUTF("可以聊天:");
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
userThread.out.writeUTF("聊天者:" + name + "昵称:"
+ nickName);
if (userThread != this) // 非本用户
{
out.writeUTF("聊天者:" + userThread.name + "昵称:"
+ userThread.nickName);
}
}
} else
// 已经有这个用户?
{
out.writeUTF("不可以聊天:");
}
} else if (info.startsWith("公共聊天内容:"))
{
String pubMsg = info.substring(info.indexOf(":") + 1);
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
((ServerThreadForUser) userEnum.nextElement()).out
.writeUTF("聊天内容:" + pubMsg);
}
} else if (info.startsWith("用户离开:"))
{
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
try
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
if (userThread != this && userThread.isAlive())
{
userThread.out.writeUTF("用户离线:" + name);
}
} catch (IOException e)
{
}
}
userList.remove(name); // 清除该用户在user list中的相应项
socket.close();
msgArea.append("用户:" + name + " 离开了\n");
break;
}
} catch (IOException e)
{ // 对于异常的处理,用户离线
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
if (userThread != this && userThread.isAlive())
{
try
{
userThread.out.writeUTF("用户离线:" + name);
} catch (IOException e1)
{
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
}
if (name != null)
userList.remove(name);
try
{
socket.close();
in.close();
out.close();
} catch (IOException e1)
{
// TODO 自动生成 catch 块
e1.printStackTrace();
}
msgArea.append("用户:" + name + " 离开了\n");
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -