1.项目说明
程序以三天时间写完
虽然 披星戴月 写完一点点程序然后修复大量Bug但还是不放心,但有一点我深信,那就是按套路来屁事没有
1.1.怎么用
1.1.1.启动服务器
之前的话还是用一个程序来控制服务器的开关,但是后来想想也是画蛇添足,便没用了
删了
过后,我把服务器源码稍微修改了那么一点,可它本质不动,然后现在就变的好看多了
原来的
之后的
是不是好看多了呢
1.1.2.启动客户端
运行ShanZhaiQQ.java
这也是比较难看的了
1.1.3.好友列表界面+登录界面
用户名:1~50,密码:123456
注意:用户名只能是1~50,因为这里聊天对象名默认为1-50,这样会找不到聊天对象,会报错
成功登录后,双击你想聊天的对象,即可弹出聊天窗口
1.1.4.聊天窗口(待更)
聊天窗口只能进行1对1对话,如果登录3个账号,对其中一人聊天,会报错
多对多对话还未完成,但是可以进行登录2个账号,对其中一人聊天了!
1.1.5.发送消息
文本框里输入你想聊天的话,点击发送即可
2.下载
(悄悄咪咪把链接放在这应该没有人知道啊)
提取码:qy4k
链接是旧版的,我现在内存也不足了,所以👇
3.更改核心源码
把你的双手动动,就可以了!
这就是运行服务器的效果
1.解脱
把MyServerFrame.java无情的删了
之后别忘了在服务器增加一段代码
public static void main(String []args){
QQServer qs =new QQServer();
}
这样咱们的服务器才算是正式解脱别人的控制
2.窗口设置
如果不想要一个美丽的窗口,而是在控制台输出一些低级玩意,亏自己是个程序猿
2.1.定义需要的组件
两个Panel,一个按钮,完成!
//定义需要的组件
JPanel jp1,jp2;
JButton jb1;
2.2.创建组件
组件定义好了,就要创建
jp1为第一个画板,它负责用来安装按钮,放在北部
jp1 =new JPanel();
jb1 =new JButton("关闭服务器");
jb1.addActionListener(this);//监听是否按下按钮
jp1.add(jb1);//安装按钮
jp2 =new JPanel(new GridLayout(20,1,1,1));//设有20个用户登录信息
2.2.数组+监听事件
监听事件就要用到接口ActionLitener,用来监听按钮点击事件
implements ActionListener
之后添加未实现的方法,在那里增加一段语句
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
//如果按下按钮,就关闭服务器
if(e.getSource()==jb1){
System.exit(0);
}
}
有20个用户登录信息,那么咱们就用Label为类型
JLabel []jp =new JLabel[50];
之后把用户信息get到,放到Label再安装再安装
int i=0;
jp[i] =new JLabel("用户ID:"+u.getName()+" 密码:"+u.getPass()+" 登录时间:"+dateFormat.format(date));
jp2.add(jp[i]);
this.add(jp2);
i++;
为此程序完成
我再发一遍全部源码吧
/**
* 功能:
* 1.这是qq服务器,它在监听,等待某个qq客户端,来连接
* 2.加强,有窗口
*/
package qqProject;
import java.net.*;
import java.text.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings({"unused","resource","serial"})
public class QQServer extends JFrame implements ActionListener {
//定义需要的组件
JPanel jp1,jp2;
JButton jb1;
int i=0;
public static void main(String []args){
QQServer qs =new QQServer();
}
public QQServer()
{
//创建
JLabel []jp =new JLabel[50];
jp1 =new JPanel();
jb1 =new JButton("关闭服务器");
jb1.addActionListener(this);
jp1.add(jb1);
jp2 =new JPanel(new GridLayout(20,1,1,1));
try{
//在9999监听
ServerSocket ss =new ServerSocket(9999);
this.add(jp1,"North");
this.setSize(500,400);
this.setVisible(true);
this.setTitle("后台管理");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//阻塞,等待连接
while(true)
{
Socket s =ss.accept();
//获取当前时间
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("HH:mm:ss");
//接收客户端发来的信息
ObjectInputStream ois =new ObjectInputStream(s.getInputStream());
User u=(User)ois.readObject();
Message m =new Message();
ObjectOutputStream oos =new ObjectOutputStream(s.getOutputStream());
//每次创建一个Label并安上给jp2
jp[i] =new JLabel("用户ID:"+u.getName()+" 密码:"+u.getPass()+" 登录时间:"+dateFormat.format(date));
jp2.add(jp[i]);
this.add(jp2);
i++;
if(u.getPass().equals("123456")){
//返回一个成功登录的信息包
m.setMesType("1");
oos.writeObject(m);
//这里就单开一个线程,让该线程与该客户端保持通讯
SerConClientThread scct =new SerConClientThread(s);
ManageClientThread.addClientThread(u.getName(),scct);
//启动与该客户端通讯的线程
scct.start();
}else{
m.setMesType("2");
oos.writeObject(m);
s.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
this.add(jp2,"South");
}
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
//如果按下按钮,就关闭服务器
if(e.getSource()==jb1){
System.exit(0);
}
}
}
是不是很简单呢