项目分析
项目描述:
作为一个即时通讯系统,该项目的主要功能为聊天,包括群聊和私聊,即对所有人聊天和对单
人聊天.
系统结构:
该项目将系统分为客户端和服务器两部分,分别放在包 com.frame 和 com.server 中,
客户端负责登录和向服务器发送消息,接收服务器消息;
服务器负责接收客户端发送来的消息并向所有或个别用户发送消息
功能模块:
Login.java:用户的登录窗口类
Connect()方法:处理客户端与服务器的连接,将登录用户信息(用户名)发送给服务器,以便
添加用户集合.
Check()方法:检查用户名和密码是否都合法输入,如果判断合法,则进行 Connect 操作与服
务器通信.
MyFrame.Java:客户端聊天的主界面,包括公共频道,私人频道,好友列表,私聊选项和发送消
息.客户端对消息的发送和接收都在其中处理.
MyFrame(BufferedReader in,PrintWriter out,String name)方法:MyFrame 窗口的构造函
数,实现窗口的布局,并接收从 Login.java 传过来的输入输出流 in/out,登录用户名 name.
actionPerformed(ActionEvent e)方法:”发送按钮”的动作监听,处理客户端消息的发送,
根据要发送的对象判断是群聊还是私聊,发送的对象不同,发送的消息内容不同,消息格式
为”all&mywords”或”private&+withwho+mywords”.以&符号为分格符,区分发送类型,发
送对象,消息内容.
Run()方法:线程的起始调用方法,对服务器进行监听,接收服务器发送来的消息,并能够更新
在线用户列表.
itemStateChanged(ItemEvent e)方法:对私聊选项进行监听,根据是否选中确认是否进行私
聊操作.
Server.java:服务器类,处理服务器的创建,用户集合的维护,消息的各类发送
Server()方法;构造函数,创建服务器对象,接受客户端的连接.
Add(Socket s,User u)方法:将客户端的用户名和 Socket 添加到集合中
Delete(Socket s,User u)方法:将退出的用户从集合中删除
SendAll(String s)方法:将消息发送给所有用户
sendOne(string name,string msg)方法:将消息发送给特定的用户
1. 页面 login,MyFrame 进行连接
Login 页面:
public class Login extends JFrame {
private JButton login, reset;
private JLabel username, password;
private JTextField namefield;
private JPasswordField passfield;
public Login() {
this.setTitle("登录");
Container c = this.getContentPane();
c.setLayout(null);
// ------------ 实 例 化 每 个 组 件
---------------------------------
login = new JButton("登录");
reset = new JButton("重置");
username = new JLabel("用户名:");
password = new JLabel("密 码:");
namefield = new JTextField();
passfield = new JPasswordField();
// ----------- 每 个 组 件 排 放 位 置
-----------------------------------
username.setBounds(40, 20, 50, 20);
password.setBounds(40, 50, 50, 20);
namefield.setBounds(100, 20, 130, 20);
passfield.setBounds(100, 50, 130, 20);
login.setBounds(70, 80, 70, 20);
reset.setBounds(150, 80, 70, 20);
// ------------- 组 件 添 加 到 面 板 上
--------------------------------
c.add(username);
c.add(password);
c.add(namefield);
c.add(passfield);
c.add(login);
c.add(reset);
this.setSize(350, 150);
this.setVisible(true);
this.setResizable(false);
this.setLocation(100, 100);
// 为组件添加监听
login.addActionListener(new ButtonAction());
}
// --------------登录按钮监听----------------------------------
class ButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == login) {
check();
}
if (e.getSource() == reset) {
namefield.setText("");
}
}
}
//----------------- 对 用 户 和 密 码 进 行 判 断
----------------------------------------
public void check(){
if((namefield.getText()).trim().length() == 0){
JOptionPane.showMessageDialog(Login.this, " 请 输 入 用 户 名