基于TCP/Socket的在线聊天室
思路
Java网络编程中,可以利用Socket套接字实现连接通信
- 需要一个服务器端,用于接收客户端的消息,并转发给所有在线用户(群聊)
- 客户端,给服务器发送消息,并接收来自服务器的消息
- 核心:Socket、ServerSocket、多线程
具体实现类
该程序一共由4个类组成:
- LoginDialog: 用于用户登录,获得一个用户名。
- ClientGUI:构建一个聊天室的GUI界面
- Client:客户端功能实现,其中包括了两个内部类:
- SendThread:发送消息给服务器的线程
- ReceiveThread:监听接收服务器发来消息的线程
- Server:服务器端功能实现,其中包含一个内部类:
- SocketThread:每当接收到一个客户端的连接时,创捷一个该线程用于于客户端通信
消息传输格式
说明:
开头视为标识符,每一部分用#分隔。
用户TO服务器:
- login#userName:表示一个新的用户,每当有新的用户到来,服务器会告知所有的客户端同步GUI中的用户列表
- mes#userName#content:一条正常的消息
- exit#userName:告诉服务器,该用户退出了聊天室
服务器TO用户
- update#user1#user2#user3…:用于同步用户列表。
- mes#content:所有用户显示在聊天框中的内容
具体代码
LoginDialog:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginDialog extends JDialog{
private JLabel label = new JLabel("NickName:");
private JTextField textField = new JTextField(30);
private JButton confirm = new JButton("Login");
public LoginDialog() {
setTitle("Login");
setSize(300,200);
setLocationRelativeTo(null);
Container container = getContentPane();
JPanel panel = new JPanel(null);
label.setBounds(20,60,100,30);
label.setFont(new Font("幼圆",Font.BOLD,18));
textField.setFont(new Font("幼圆",Font.BOLD,18));
textField.setBounds(120,60,150,30);
panel.add(label);
panel.add(textField);
container.add(panel,<