Java——多人聊天室(基于TCP的网络编程——Socket)
服务端源代码:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Server extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JTextField port; // 端口号文本框
private JButton start; // 启动服务器
private JButton stop; // 停止服务器
private JTextArea info; // 显示服务器消息
private JTextField msg; // 发送消息文本框
private JButton send; // 发送消息按钮
private List<Socket> sockets; // 保存服务器端所有Socket对象
private ServerSocket server; // 服务器ServerSocket对象
public Server() {
initFrame();
this.setVisible(true);
}
/**
* 初始化服务器界面
*/
private void initFrame() {
this.setTitle("服务器");
this.setSize(500, 500);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 窗体各组件对象
JLabel lblPort = new JLabel("监听端口:");
port = new JTextField("8899", 6);
port.setHorizontalAlignment(JTextField.CENTER);
start = new JButton("启动服务器");
stop = new JButton("停止服务器");
info = new JTextArea("日志:\n");
info.setEditable(false);
JScrollPane jsp = new JScrollPane(info);
msg = new JTextField(25);
send = new JButton("发送");
// 布局
JPanel pnlNorth = new JPanel();
pnlNorth.add(lblPort);
pnlNorth.add(port);
pnlNorth.add(start);
pnlNorth.add(stop);
this.add(pnlNorth, BorderLayout.NORTH);
this.add(jsp, BorderLayout.CENTER);
JPanel pnlSouth = new JPanel();
JLabel lblMsg = new JLabel("向所有人发送:");
pnlSouth.add(lblMsg);
pnlSouth.add(msg);
pnlSouth.add(send);
this.add(pnlSouth, BorderLayout.SOUTH);
//注册事件监听器
start.addActionListener(this);
stop.addActionListener(this);
send.addActionListener(this);
msg.addActionListener(this);
}
/**
* 启动服务器Socket资源信息
*/
private void startServer() {
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Server extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JTextField port; // 端口号文本框
private JButton start; // 启动服务器
private JButton stop; // 停止服务器
private JTextArea info; // 显示服务器消息
private JTextField msg; // 发送消息文本框
private JButton send; // 发送消息按钮
private List<Socket> sockets; // 保存服务器端所有Socket对象
private ServerSocket server; // 服务器ServerSocket对象
public Server() {
initFrame();
this.setVisible(true);
}
/**
* 初始化服务器界面
*/
private void initFrame() {
this.setTitle("服务器");
this.setSize(500, 500);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 窗体各组件对象
JLabel lblPort = new JLabel("监听端口:");
port = new JTextField("8899", 6);
port.setHorizontalAlignment(JTextField.CENTER);
start = new JButton("启动服务器");
stop = new JButton("停止服务器");
info = new JTextArea("日志:\n");
info.setEditable(false);
JScrollPane jsp = new JScrollPane(info);
msg = new JTextField(25);
send = new JButton("发送");
// 布局
JPanel pnlNorth = new JPanel();
pnlNorth.add(lblPort);
pnlNorth.add(port);
pnlNorth.add(start);
pnlNorth.add(stop);
this.add(pnlNorth, BorderLayout.NORTH);
this.add(jsp, BorderLayout.CENTER);
JPanel pnlSouth = new JPanel();
JLabel lblMsg = new JLabel("向所有人发送:");
pnlSouth.add(lblMsg);
pnlSouth.add(msg);
pnlSouth.add(send);
this.add(pnlSouth, BorderLayout.SOUTH);
//注册事件监听器
start.addActionListener(this);
stop.addActionListener(this);
send.addActionListener(this);
msg.addActionListener(this);
}
/**
* 启动服务器Socket资源信息
*/
private void startServer() {