今天翻硬盘的workspace发现一个Java Socket实现多人聊天室的源码,不记得是什么时候的事情了,貌似不是我写的。但写得还不错,
至少算个有模有样的聊天室工具。我简单的修改了一下,拿出来跟大家分享一下,仅供参考。。。
界面是用swing写的,还不懒,简约大方。有图有真相:
正如上图所示,这个程序分为 服务器端和客户端,说白了就是 两个main class,用eclipse直接运行之。。。。。
聊天室的设计思想是 :在局域网下, 利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连
接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能。
程序中有三个类,分别 Server.java(服务器端)、Client(客户端)、User.java(javabean)。代码如下:
Server.java(服务器端):
-
import java.awt.BorderLayout;
-
import java.awt.Color;
-
import java.awt.GridLayout;
-
import java.awt.Toolkit;
-
import java.awt.event.ActionEvent;
-
import java.awt.event.ActionListener;
-
import java.awt.event.WindowAdapter;
-
import java.awt.event.WindowEvent;
-
import java.io.BufferedReader;
-
import java.io.IOException;
-
import java.io.InputStreamReader;
-
import java.io.PrintWriter;
-
import java.net.BindException;
-
import java.net.ServerSocket;
-
import java.net.Socket;
-
import java.util.ArrayList;
-
import java.util.StringTokenizer;
-
-
import javax.swing.DefaultListModel;
-
import javax.swing.JButton;
-
import javax.swing.JFrame;
-
import javax.swing.JLabel;
-
import javax.swing.JList;
-
import javax.swing.JOptionPane;
-
import javax.swing.JPanel;
-
import javax.swing.JScrollPane;
-
import javax.swing.JSplitPane;
-
import javax.swing.JTextArea;
-
import javax.swing.JTextField;
-
import javax.swing.border.TitledBorder;
-
-
public class Server {
-
-
private JFrame frame;
-
private JTextArea contentArea;
-
private JTextField txt_message;
-
private JTextField txt_max;
-
private JTextField txt_port;
-
private JButton btn_start;
-
private JButton btn_stop;
-
private JButton btn_send;
-
private JPanel northPanel;
-
private JPanel southPanel;
-
private JScrollPane rightPanel;
-
private JScrollPane leftPanel;
-
private JSplitPane centerSplit;
-
private JList userList;
-
private DefaultListModel listModel;
-
-
private ServerSocket serverSocket;
-
private ServerThread serverThread;
-
private ArrayList<ClientThread> clients;
-
-
private boolean isStart = false;
-
-
// 主方法,程序执行入口
-
public static void main(String[] args) {
-
new Server();
-
}
-
-
// 执行消息发送
-
public void send() {
-
if (!isStart) {
-
JOptionPane.showMessageDialog(frame, "服务器还未启动,不能发送消息!", "错误",
-
JOptionPane.ERROR_MESSAGE);
-
return;
-
}
-
if (clients.size() == 0) {
-
JOptionPane.showMessageDialog(frame, "没有用户在线,不能发送消息!", "错误",
-
JOptionPane.ERROR_MESSAGE);
-
return;
-
}
-
String message = txt_message.getText().trim();
-
if (message == null || message.equals("")) {
-
JOptionPane.showMessageDialog(frame, "消息不能为空!", "错误",
-
JOptionPane.ERROR_MESSAGE);
-
return;
-
}
-
sendServerMessage(message);// 群发服务器消息
-
contentArea.append("服务器说:" + txt_message.getText() + "rn");
-
txt_message.setText(null);
-
}
-
-
// 构造放法
-
public Server() {
-
frame = new JFrame("服务器");
-
// 更改JFrame的图标:
-
//frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));
-
frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("qq.png")));
-
contentArea = new JTextArea();
-
contentArea.setEditable(false);
-
contentArea.setForeground(Color.blue);
-
txt_message = new JTextField();
-
txt_max = new JTextField("30");
-
txt_port = new JTextField("6666");
-
btn_start = new JButton("启动");
-
btn_stop = new JButton("停止");
-
btn_send = new JButton("发送");
-
btn_stop.setEnabled(false);
-
listModel = new DefaultListModel();
-
userList = new JList(listModel);
-
-
southPanel = new JPanel(new BorderLayout());
-
southPanel.setBorder(new TitledBorder("写消息"));
-
southPanel.add(txt_message, "Center");
-
southPanel.add(btn_send, "East");
-
leftPanel = new JScrollPane(userList);
-
leftPanel.setBorder(new TitledBorder("在线用户"));
-
-
rightPanel = new JScrollPane(contentArea);
-
rightPanel.setBorder(new TitledBorder("消息显示区"));
-
-
centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,
-
rightPanel);
-
centerSplit.setDividerLocation(100);
-
northPanel = new JPanel();
-
northPanel.setLayout(new GridLayout(1, 6));
-
northPanel.add(new JLabel("人数上限"));
-
northPanel.add(txt_max);
-
northPanel.add(new JLabel("端口"));
-
northPanel.add(txt_port);
-
northPanel.add(btn_start);
-
northPanel.add(btn_stop);
-
northPanel.setBorder(new TitledBorder("配置信息"));
-
-
frame.setLayout(new BorderLayout());
-
frame.add(northPanel, "North");
-
frame.add(centerSplit, "Center");
-
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xuxile/article/details/42736881
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
-
发表于 2020-03-01 22:38:58
- 阅读 ( 1340 )
- 分类: