这个局域网聊天系统,是为了能够在一个没有连接到intent的局域网中,进行聊天的一个程序。本程序包括服务器和客户机两部分,可以实现多人聊天和两个人私聊的一个工具。
开发语言:Java,开发工具:eclipse。
客户机代码如下:
Client.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.Socket;
import java.util.HashMap;
import java.util.Map;
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 Client{
//客户端
JFrame frame;
JList<String> userList;//列表组件
JTextArea textArea;//文本域
JTextField textField;
JTextField txt_port,txt_Ip,txt_name;
JButton button_start,button_stop,button_send;//连接按钮,断开按钮,发送按钮
JPanel north,south;//上、下面板
JScrollPane rightScroll,leftScroll;//左右滚动面板
JSplitPane centerSplit;//分割面板
DefaultListModel<String> listModel;//点击事件
private boolean crossFire = false;
Socket socket;//套接字
PrintWriter writer;
BufferedReader reader;
MessageThread messageThread;// 负责接收消息的线程
private Map<String, User> onLineUsers = new HashMap<String, User>();// 所有在线用户集合
public void send() {
//发送方法
if (!crossFire) {
JOptionPane.showMessageDialog(frame, "Warning!无法连接服务器", "错误",JOptionPane.ERROR_MESSAGE);
return;
}
String message = textField.getText().trim();
if (message == null || message.equals("")) {
JOptionPane.showMessageDialog(frame, "Warning! 消息不能为空!", "错误",JOptionPane.ERROR_MESSAGE);
return;
}
sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message);
textField.setText(null);
}
public Client() {
//创建构造方法
textArea = new JTextArea();
textArea.setEditable(false);//设置文本域不可读
textArea.setForeground(Color.RED);//设置背景颜色位红色
textField = new JTextField();
txt_port = new JTextField();//端口号
txt_Ip = new JTextField();//服务器IP
txt_name = new JTextField();//用户名
button_start = new JButton("连接");
button_stop = new JButton("断开");
button_send = new JButton("发送");
listModel = new DefaultListModel<String>();
userList = new JList<String>(listModel);
north = new JPanel();
north.setLayout(new GridLayout(1, 4));//设置布局方式
north.add(new JLabel("端口"));
north.add(txt_port);//在JPanel组件中添加端口组件
north.add(new JLabel("服务器IP:"));
north.add(txt_Ip);//在JPanel组件中添加IP组件
north.add(new JLabel("姓名:"));
north.add(txt_name);//添加文本域组件
north.add(button_start);//添加按钮组件
north.add(button_stop);//添加按钮组件
north.setBorder(new TitledBorder("连接信息"));
rightScroll = new JScrollPane(textArea);
rightScroll.setBorder(new TitledBorder("聊天记录区"));
leftScroll = new JScrollPane(userList);
leftScroll.setBorder(new TitledBorder("在线用户明细"));//设置组件的边框
south = new JPanel(new BorderLayout());
south.add(textField, "Center");
south.add(button_send, "East");
south.setBorder(new TitledBorder("写消息"));
centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll,rightScroll);
centerSplit.setDividerLocation(100);//设置分隔条的相对位置
frame = new JFrame("客户端");
frame.add(north, "North");
frame.add(centerSplit, "Center");
frame.add(south, "South");
frame.setSize(750, 350);
int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;//获取屏幕的宽度
int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕的高度
frame.setLocation((screen_width - frame.getWidth()) / 2,(screen_height - frame.getHeight()) / 2);//设置窗口的相对位置
frame.setVisible(true);//设置组件可见
// 写消息的文本框中按回车键时事件
textField.addActionListener(new ActionListener() {
//添加监听,监听文本域消息
public void actionPerformed(ActionEvent arg0) {
send();
}
});
// 单击发送按钮时事件
button_send.addActionListener(new ActionListener() {
//添加监听,监听发送按钮消息
public void actionPerformed(ActionEvent e) {
send();
}
});
// 单击连接按钮时事件
button_start.addActionListener(new ActionListener() {
//添加监听,监听连接按钮消息
public void actionPerformed(ActionEvent e) {
int port;
if (crossFire) {
JOptionPane.showMessageDialog(frame, "WARNING! 重复链接","错误", JOptionPane.ERROR_MESSAGE);
return;
}
try {
try {
port = Integer.parseInt(txt_port.getText().trim());
} catch (NumberFormatException e2) {
throw new Exception("端口号错误! 端口应为整数!");
}
String hostIp = txt_Ip.getText().trim();
String name = txt_name.getText().trim();
if (name.equals("")) {
throw new Exception(