【小小的项目|【基于Java和Socket等技术的聊天室系统的设计与实现-----这或许就是QQ的原型之一吧!(效果+源码+论文+视频介绍等获取~!)】
目录
-
- (一)效果截图展示
- (二)代码示例
- (三)获取
(一)效果截图展示 项目很基础,展示一些实现的基本界面,如下:
【【小小的项目|【基于Java和Socket等技术的聊天室系统的设计与实现-----这或许就是QQ的原型之一吧!(效果+源码+论文+视频介绍等获取~!)】】启动服务器:
这个界面用来记录系统当前有多少用户登录,以及用户的登录状态,用户之间的交互状态等。同时也可以保存日志。

文章图片
启动用户登录界面:

文章图片
我们先来注册一下几个用户:
(点击上图中的
注册
即可)这是 注册 的初始化界面:

文章图片
注册用户:

文章图片
这里我们注册一个用户,用户名:小红,口令:123。
其中,基本的
出错处理
都已经实现,比如 注册的用户已经存在,则会提示:
文章图片
诸如此,两次密码输入不一致、年龄输入不合法、电子邮箱格式不合法等都会提示消息,告知用户注册失败,这里我们不再展示。
我们再注册两个用户,便于演示系统功能:

文章图片

文章图片
另一方面,在注册用户成功的同时,来看一下
服务器端
的显示:可以看到,很清晰的记录了用户的注册。

文章图片
下面,我们来分别
登录
刚刚注册过的三个用户:这是三个用户登录之后,用户
小红
这一端的窗口显示:(当小红首先登录之后,当然在线人数会是 显示 1,随着用户分别登录或退出,在线人数也会依次增加或减少,这是基础功能)

文章图片
服务器端显示:
也是清楚的记录了用户登录的
时间
:
文章图片
下面再来测试
聊天
这一核心功能:首先是
群聊
,顾名思义,就是用户的发言,所有用户都等看到:小红说:大家好!我是小红~

文章图片
上面是小红的发言窗口,下面我们以用户 小明的 窗口再来看看:(小刚的窗口也是类似,这里不再展示)
可以看出来,群聊这一功能,实现成功。

文章图片
下面是
私聊
这一功能:小明对小红 私聊说:可以交个朋友吗?

文章图片
小红这端显示:

文章图片
那么此时,我们再来看一下 用户 小刚 这里的显示:

文章图片
可以看出来,私聊这个功能,也已经实现。
这时,我们来看一下服务器端的显示:

文章图片
我们设置的用户的群聊信息在服务器端可以展示,私聊需要额外设计展示方式。同时,服务器端可以向所有用户发送信息:
服务端端(即系统)说:大家好!我是服务器。

文章图片
用户这一端,我们 以 小红 的窗口为例展示:
可以看到“系统消息”,说明这个功能也已经实现。

文章图片
用户退出之后,服务器端显示:

文章图片
同时,清屏、保存、退出等基础功能也已经实现,这里不再展示了哈~ ~
项目的界面展示到此结束,不再赘述了。
(二)代码示例
Login.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
/**
* 聊天系统登录程序
*/
public class Login extends JFrame implements ActionListener {
private static final long serialVersionUID = -8965773902056088264L;
private JPanel pnlLogin;
private JButton btnLogin, btnRegister, btnExit;
private JLabel lblServer, lblUserName, lblPassword, lblLogo;
private JTextField txtUserName, txtServer;
private JPasswordField pwdPassword;
private String strServerIp;
// 用于将窗口定位
private Dimension scrnsize;
private Toolkit toolkit = Toolkit.getDefaultToolkit();
/**
* 构造登陆窗体
*/
public Login() {
super("登录聊天室");
pnlLogin = new JPanel();
this.getContentPane().add(pnlLogin);
lblServer = new JLabel("服务器:");
lblUserName = new JLabel("用户名:");
lblPassword = new JLabel("口令:");
txtServer = new JTextField(20);
txtServer.setText("127.0.0.1");
txtUserName = new JTextField(20);
pwdPassword = new JPasswordField(20);
btnLogin = new JButton("登录");
btnLogin.setToolTipText("登录到服务器");
btnLogin.setMnemonic('L');
btnRegister = new JButton("注册");
btnRegister.setToolTipText("注册新用户");
btnRegister.setMnemonic('R');
btnExit = new JButton("退出");
btnExit.setToolTipText("退出系统");
btnExit.setMnemonic('X');
/***********************************************************************
* 该布局采用手动布局 setBounds设置组件位置 * setFont设置字体、字型、字号 * setForeground设置文字的颜色 *
* setBackground设置背景色 * setOpaque将背景设置为透明
*/
pnlLogin.setLayout(null);
// 组件用手动布局
pnlLogin.setBackground(new Color(52, 130, 203));
lblServer.setBounds(50, 100, 100, 30);
txtServer.setBounds(150, 100, 120, 25);
lblUserName.setBounds(50, 130, 100, 30);
txtUserName.setBounds(150, 130, 120, 25);
lblPassword.setBounds(50, 160, 100, 30);
pwdPassword.setBounds(150, 160, 120, 25);
btnLogin.setBounds(50, 200, 80, 25);
btnRegister.setBounds(130, 200, 80, 25);
btnExit.setBounds(210, 200, 80, 25);
Font fontstr = new Font("宋体", Font.PLAIN, 12);
lblServer.setFont(fontstr);
txtServer.setFont(fontstr);
lblUserName.setFont(fontstr);
txtUserName.setFont(fontstr);
lblPassword.setFont(fontstr);
pwdPassword.setFont(fontstr);
btnLogin.setFont(fontstr);
btnRegister.setFont(fontstr);
btnExit.setFont(fontstr);
lblUserName.setForeground(Color.BLACK);
lblPassword.setForeground(Color.BLACK);
btnLogin.setBackground(Color.ORANGE);
btnRegister.setBackground(Color.ORANGE);
btnExit.setBackground(Color.ORANGE);
pnlLogin.add(lblServer);
pnlLogin.add(txtServer);
pnlLogin.add(lblUserName);
pnlLogin.add(txtUserName);
pnlLogin.add(lblPassword);
pnlLogin.add(pwdPassword);
pnlLogin.add(btnLogin);
pnlLogin.add(btnRegister);
pnlLogin.add(btnExit);
// 设置背景图片
Icon logo1 = new ImageIcon("images\\loginlogo.jpg");
lblLogo = new JLabel(logo1);
lblLogo.setBounds(0, 0, 340, 66);
pnlLogin.add(lblLogo);
// 设置登录窗口
setResizable(false);
setSize(340, 260);
setVisible(true);
scrnsize = toolkit.getScreenSize();
setLocation(scrnsize.width / 2 - this.getWidth() / 2, scrnsize.height
/ 2 - this.getHeight() / 2);
Image img = toolkit.getImage("images\\appico.jpg");
setIconImage(img);
// 三个按钮注册监听
btnLogin.addActionListener(this);
btnRegister.addActionListener(this);
btnExit.addActionListener(this);
} // 构造方法结束
/**
* 按钮监听响应
*/
@SuppressWarnings({ "deprecation", "static-access" })
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if (source.equals(btnLogin)) {
// 判断用户名和密码是否为空
if (txtUserName.getText().equals("")
|| pwdPassword.getText().equals("")) {
JOptionPane op1 = new JOptionPane();
op1.showMessageDialog(null, "用户名或密码不能为空");
} else {
strServerIp = txtServer.getText();
login();
}
}
if (source.equals(btnRegister)) {
strServerIp = txtServer.getText();
this.dispose();
new Register(strServerIp);
}
if (source == btnExit) {
System.exit(0);
}
} // actionPerformed()结束
/**
* 登录事件响应方法
*/
@SuppressWarnings("deprecation")
public void login() {
// 接受客户的详细资料
Customer data = https://www.it610.com/article/new Customer();
data.custName = txtUserName.getText();
data.custPassword = pwdPassword.getText();
try {
// 连接到服务器
Socket toServer;
toServer = new Socket(strServerIp, 1001);
ObjectOutputStream streamToServer = new ObjectOutputStream(toServer
.getOutputStream());
// 写客户详细资料到服务器socket
streamToServer.writeObject((Customer) data);
// 读来自服务器socket的登录状态
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(toServer.getInputStream()));
String status = fromServer.readLine();
if (status.equals("登录成功")) {
new ChatRoom((String) data.custName, strServerIp);
this.dispose();
// 关闭流对象
streamToServer.close();
fromServer.close();
toServer.close();
} else {
JOptionPane.showMessageDialog(null, status);
// 关闭流对象
streamToServer.close();
fromServer.close();
toServer.close();
}
} catch (ConnectException e1) {
JOptionPane.showMessageDialog(null, "未能建立到指定服务器的连接!");
} catch (InvalidClassException e2) {
JOptionPane.showMessageDialog(null, "类错误!");
} catch (NotSerializableException e3) {
JOptionPane.showMessageDialog(null, "对象未序列化!");
} catch (IOException e4) {
JOptionPane.showMessageDialog(null, "不能写入到指定服务器!");
}
} // login()结束
/**
* 启动登陆窗体
* @param args
*/
public static void main(String args[]) {
new Login();
}
} // Class Login结束
由于代码行过长,仅展示这一个文件。
(三)获取
聊天室系统包含项目所有
源代码
以及论文
资料、视频讲解
说明、项目部署
过程、项目截图
、项目学习路线
、已经注册过的用户信息记录等等,需要该项目的朋友请私聊我哈!有空回复- ~
推荐阅读
- SSM框架解析|【SSM框架】Mybatis详解10(源码自取)之入参、返回值map
- 链表|[java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
- 经验之谈|猿创征文|当我在追光 我与光同航--我与Java的技术成长之路
- 直击面试|【直击面试】JVM这些面试题你都会了吗
- SSM框架解析|【SSM框架】Mybatis详解11(源码自取)之表关联关系
- tidb|我和tidb 的故事 - 我们终会在平行世界相遇
- RxJava2 只看这一篇文章就够了
- 微服务|spring cloud sleuth+zipkin 实现分布式链路跟踪
- 分布式|五分钟学会 Spring Cloud Sleuth(分布式请求链路跟踪(小白必看,一看就会教程))