文章目录

  • 前言
  • 一、项目设计
    • 1. 模块设计
      • 服务器模块设计
      • 客户端模块设计
    • 2. 实现效果
  • 二、部分源码
  • 项目源码

前言

今天学长向大家分享一个 java 设计项目:

基于Java聊天室系统的设计与实现

一、项目设计

1. 模块设计


服务器模块设计

服务端的功能主要如下:

  • 一:能够开启和关闭服务器。
  • 二:等待着客户端从特殊端口发送的请求。
  • 三:监听的端口并不是固定的,服务端的端口是能够自定义的。
  • 四:能够广播消息向所有连接到服务器的用户。

客户端和服务器之间通过socket套接字进行连接,socket的使用在java当中并不复杂,十分的简单。API提供了一个专门的类来处理,让编写程序变得十分简单。多线程的技术在服务器端得到了充分的体现,服务器能够同时处理来自不同IP的客户端的请求。通过循环调用serversocket对象的方法来监听是否有来自客户端的请求。

客户端模块设计

客户端的功能主要如下:

  • 一:能够和服务端进行连接。
  • 二:新的用户能够注册账号。
  • 三:通过用户名以及密码完成用户的登陆,连接到聊天室。
  • 四:用户能够在聊天室发送消息。

客户端通过socket与服务器建立连接。通过java对象的流来进行信息的传递,服务器接受请求返回对象,然后返回给客户端信息。不同的客户端的信息在服务端能够进行不同的处理。

2. 实现效果

服务器界面

登录界面

用户聊天界面

二、部分源码

部分代码示例:

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;public class ChatRoom extends Thread implements ActionListener {static JFrame frmChat;JPanel pnlChat;JButton btnCls, btnExit, btnSend, btnClear, btnSave;JLabel lblUserList, lblUserMessage, lblSendMessage, lblChatUser;JLabel lblUserTotal, lblCount, lblBack;JTextField txtMessage;java.awt.List lstUserList;TextArea taUserMessage;JComboBox cmbUser;JCheckBox chPrivateChat;String strServerIp, strLoginName;Thread thread;final JLabel headLabel = new JLabel();Dimension scrnsize;Toolkit toolkit = Toolkit.getDefaultToolkit();Message messobj = null;String serverMessage = "";// ���췽��public ChatRoom(String name, String ip) {strServerIp = ip;strLoginName = name;frmChat = new JFrame("������" + "[�û�:" + name + "]");pnlChat = new JPanel();frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmChat.getContentPane().add(pnlChat);Font fntDisp1 = new Font("����", Font.PLAIN, 12);String list[] = { "������" };btnCls = new JButton("����");btnExit = new JButton("�˳�");btnSend = new JButton("����");btnSave = new JButton("����");lblUserList = new JLabel("�������û��б���");lblUserMessage = new JLabel("��������Ϣ��");lblSendMessage = new JLabel("��������:");lblChatUser = new JLabel("���:");lblUserTotal = new JLabel("��������:");lblCount = new JLabel("0");lstUserList = new java.awt.List();txtMessage = new JTextField(170);cmbUser = new JComboBox(list);cmbUser.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent arg0) {freshHead();}});chPrivateChat = new JCheckBox("˽��");taUserMessage = new TextArea("", 300, 200,TextArea.SCROLLBARS_VERTICAL_ONLY);// ֻ�����¹���taUserMessage.setForeground(new Color(0, 0, 0));taUserMessage.setEditable(false); // ����д��pnlChat.setLayout(null);pnlChat.setBackground(new Color(52, 130, 203));btnSave.setBounds(500, 330, 80, 25);btnCls.setBounds(400, 330, 80, 25);btnExit.setBounds(500, 360, 80, 25);btnSend.setBounds(500, 300, 80, 25);lblUserList.setBounds(5, 0, 120, 40);lblUserTotal.setBounds(130, 0, 60, 40);lblCount.setBounds(190, 0, 60, 40);lblUserMessage.setBounds(225, 0, 180, 40);lblChatUser.setBounds(10, 290, 40, 40);lblSendMessage.setBounds(210, 290, 60, 40);lstUserList.setBounds(5, 40, 210, 255);taUserMessage.setBounds(225, 40, 360, 255);txtMessage.setBounds(270, 300, 210, 25);cmbUser.setBounds(50, 300, 80, 25);chPrivateChat.setBounds(333, 336, 60, 20);btnCls.setFont(fntDisp1);btnExit.setFont(fntDisp1);btnSend.setFont(fntDisp1);btnSave.setFont(fntDisp1);lblUserList.setFont(fntDisp1);lblUserMessage.setFont(fntDisp1);lblChatUser.setFont(fntDisp1);lblSendMessage.setFont(fntDisp1);lblUserTotal.setFont(fntDisp1);lblCount.setFont(fntDisp1);cmbUser.setFont(fntDisp1);chPrivateChat.setFont(fntDisp1);lblUserList.setForeground(Color.YELLOW);lblUserMessage.setForeground(Color.YELLOW);lblSendMessage.setForeground(Color.black);lblChatUser.setForeground(Color.black);lblSendMessage.setForeground(Color.black);lblUserTotal.setForeground(Color.YELLOW);lblCount.setForeground(Color.YELLOW);cmbUser.setForeground(Color.black);chPrivateChat.setForeground(Color.black);lstUserList.setBackground(Color.white);taUserMessage.setBackground(Color.white);btnCls.setBackground(Color.ORANGE);btnExit.setBackground(Color.ORANGE);btnSend.setBackground(Color.PINK);btnSave.setBackground(Color.ORANGE);pnlChat.add(btnCls);pnlChat.add(btnExit);pnlChat.add(btnSend);pnlChat.add(btnSave);pnlChat.add(lblUserList);pnlChat.add(lblUserMessage);pnlChat.add(lblSendMessage);pnlChat.add(lblChatUser);pnlChat.add(lblUserTotal);pnlChat.add(lblCount);pnlChat.add(lstUserList);pnlChat.add(taUserMessage);pnlChat.add(txtMessage);pnlChat.add(cmbUser);pnlChat.add(chPrivateChat);frmChat.addWindowListener(new Windowclose());btnCls.addActionListener(this);btnExit.addActionListener(this);btnSend.addActionListener(this);btnSave.addActionListener(this);lstUserList.addActionListener(this);txtMessage.addActionListener(this);headLabel.setHorizontalAlignment(SwingConstants.CENTER);headLabel.setIcon(new ImageIcon("face//1.JPG"));headLabel.setBounds(15, 335, 70, 60);pnlChat.add(headLabel);// ��������ҳ����Ϣˢ���߳�Thread thread = new Thread(this);thread.start();frmChat.setSize(600, 420);frmChat.setVisible(true);frmChat.setResizable(false);// �����ڶ�λ����Ļ����scrnsize = toolkit.getScreenSize();frmChat.setLocation(scrnsize.width / 2 - frmChat.getWidth() / 2,scrnsize.height / 2 - frmChat.getHeight() / 2);Image img = toolkit.getImage("images\\appico.jpg");frmChat.setIconImage(img);} // ���췽������@SuppressWarnings("deprecation")public void run() {int intMessageCounter = 0;int intUserTotal = 0;boolean isFirstLogin = true; // �ж��Ƿ�յ�½boolean isFound; // �ж��Ƿ��ҵ��û�Vector user_exit = new Vector();try {for (;;) {Socket toServer;toServer = new Socket(strServerIp, 1001);// ����Ϣ����������messobj = new Message();ObjectOutputStream streamtoserver = new ObjectOutputStream(toServer.getOutputStream());streamtoserver.writeObject((Message) messobj);// �����Է���������ϢObjectInputStream streamfromserver = new ObjectInputStream(toServer.getInputStream());messobj = (Message) streamfromserver.readObject();// //ˢ��������Ϣ�б�//if (isFirstLogin) // ����յ�½{intMessageCounter = messobj.chat.size(); // ���θ��û���½ǰ����������isFirstLogin = false;}if (!serverMessage.equals(messobj.serverMessage)) {serverMessage = messobj.serverMessage;taUserMessage.append("[ϵͳ��Ϣ]��" + serverMessage+"\n");}for (int i = intMessageCounter; i < messobj.chat.size(); i++) {Chat temp = (Chat) messobj.chat.elementAt(i);String temp_message;if (temp.chatUser.equals(strLoginName)) {if (temp.chatToUser.equals(strLoginName)) {temp_message = "ϵͳ��ʾ�����벻Ҫ�������" + "\n";} else {if (!temp.whisper) // �������Ļ�{temp_message = "���㡿�ԡ�" + temp.chatToUser + "��"+ "˵��" + temp.chatMessage+ "\n";} else {temp_message = "���㡿���Ķԡ�" + temp.chatToUser+ "��" + "˵��" + temp.chatMessage+ "\n";}}} else {if (temp.chatToUser.equals(strLoginName)) {if (!temp.whisper) // �������Ļ�{temp_message = "��" + temp.chatUser + "���ԡ��㡿"+ "˵��" + temp.chatMessage+ "\n";} else {temp_message = "��" + temp.chatUser + "�����Ķԡ��㡿"+ "˵��" + temp.chatMessage+ "\n";}} else {if (!temp.chatUser.equals(temp.chatToUser)) // �Է�û����������{if (!temp.whisper) // �������Ļ�{temp_message = "��" + temp.chatUser + "���ԡ�"+ temp.chatToUser + "��"+ "˵��" + temp.chatMessage + "\n";} else {temp_message = "";}} else {temp_message = "";}}}taUserMessage.append(temp_message);intMessageCounter++;}// //ˢ�������û�//lstUserList.clear();for (int i = 0; i < messobj.userOnLine.size(); i++) {String User = ((Customer) messobj.userOnLine.elementAt(i)).custName;lstUserList.addItem(User);}Integer a = new Integer(messobj.userOnLine.size());lblCount.setText(a.toString());// ��ʾ�û����������ҵ���Ϣif (messobj.userOnLine.size() > intUserTotal) {String tempstr = ((Customer) messobj.userOnLine.elementAt(messobj.userOnLine.size() - 1)).custName;if (!tempstr.equals(strLoginName)) {taUserMessage.append("��" + tempstr + "������" + "\n");}}if (messobj.userOnLine.size() < intUserTotal) {for (int b = 0; b < user_exit.size(); b++) {isFound = false;for (int c = 0; c < messobj.userOnLine.size(); c++) {String tempstr = ((Customer) user_exit.elementAt(b)).custName;if (tempstr.equals(((Customer) messobj.userOnLine.elementAt(c)).custName)) {isFound = true;break;}}if (!isFound) // û�з��ָ��û�{String tempstr = ((Customer) user_exit.elementAt(b)).custName;if (!tempstr.equals(strLoginName)) {taUserMessage.append("��" + tempstr + "������"+ "\n");}}}}user_exit = messobj.userOnLine;intUserTotal = messobj.userOnLine.size();streamtoserver.close();streamfromserver.close();toServer.close();Thread.sleep(3000);}} catch (Exception e) {@SuppressWarnings("unused")JOptionPane jop = new JOptionPane();JOptionPane.showMessageDialog(null, "�������ӷ�������");e.printStackTrace();frmChat.dispose();}} // run()����private void exitChatRoom() {exit();}// /������ť��Ӧ//public void actionPerformed(ActionEvent ae) {Object source = (Object) ae.getSource();if (source.equals(btnCls)) {clearMessage();}if (source.equals(btnExit)) {exit();}if (source.equals(btnSend)) {sendMessage();}if (source.equals(btnSave)) {saveMessage();}if (source.equals(lstUserList)) // ˫���б���{changeUser();}} // actionPerformed()����// /�������ڹر���Ӧ//class Windowclose extends WindowAdapter {public void windowClosing(WindowEvent e) {exit();}}// "����"��ťpublic void clearMessage() {taUserMessage.setText("");}// "�˳�"��ťpublic void exit() {Exit exit = new Exit();exit.exitname = strLoginName;// �����˳���Ϣtry {Socket toServer = new Socket(strServerIp, 1001);// �������������ϢObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream());outObj.writeObject(exit);outObj.close();toServer.close();frmChat.dispose();} catch (Exception e) {}} // exit()����// "����"��ťpublic void sendMessage() {Chat chatobj = new Chat();chatobj.chatUser = strLoginName;chatobj.chatMessage = txtMessage.getText();chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem());chatobj.whisper = chPrivateChat.isSelected() ? true : false;try {Socket toServer = new Socket(strServerIp, 1001);ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream());outObj.writeObject(chatobj);txtMessage.setText(""); // ����ı���outObj.close();toServer.close();} catch (Exception e) {}}// "����"��ťpublic void saveMessage() {try {FileOutputStream fileoutput = new FileOutputStream(this.strLoginName + "_message.txt", true);String temp = taUserMessage.getText();fileoutput.write(temp.getBytes());fileoutput.close();JOptionPane.showMessageDialog(null, "�����¼������" + this.strLoginName+ "_message.txt");} catch (Exception e) {System.out.println(e);}}// ����ѡ�û����ӵ�cmbUser��public void changeUser() {boolean key = true;String selected = lstUserList.getSelectedItem();for (int i = 0; i < cmbUser.getItemCount(); i++) {if (selected.equals(cmbUser.getItemAt(i))) {key = false;break;}}if (key == true) {cmbUser.insertItemAt(selected, 0);}String head = getUserHead(lstUserList.getSelectedItem());cmbUser.setSelectedItem(selected);headLabel.setIcon(new ImageIcon("face//" + head + ".JPG"));}protected void freshHead() {String head = getUserHead(cmbUser.getSelectedItem().toString());headLabel.setIcon(new ImageIcon("face//" + head + ".JPG"));}private String getUserHead(String selectedItem) {String head = "oo";for (int i = 0; i < messobj.userOnLine.size(); i++) {String User = ((Customer) messobj.userOnLine.elementAt(i)).custName;head = ((Customer) messobj.userOnLine.elementAt(i)).custHead;if (User.equals(selectedItem)) {break;}}return head;}public static void main(String args[]) {new ChatRoom("�����û�", "127.0.0.1");}}

项目源码

毕业设计 - 基于Java的聊天室系统设计与实现【源码+论文】相关推荐

  1. 毕业设计 - 基于java web的在线考试系统【源码+论文】

    文章目录 前言 一.项目设计 1. 模块设计 2. 基本功能 2.1 登录功能 2.2 系统答题 2.3 答题得分 2.4 错题解析 3. 实现效果 二.部分源码 项目源码 前言 今天学长向大家分享一 ...

  2. 计算机毕业设计 基于java web的在线考试系统(源码+论文)

    文章目录 1 项目简介 2 实现效果 3 系统设计 3.2 系统设计流程 4 关键代码 5 论文概览 6 最后 1 项目简介

  3. 毕业设计 基于java web的在线图书管理系统(源码+论文)

    文章目录 1 项目简介 2 实现效果 3 系统设计 3.1 功能需求 3.2 功能设计 4 关键代码 5 论文概览 6 最后 1 项目简介

  4. 基于java的聊天室系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)

    项目报告 Java网络聊天室系统的设计与实现 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有 ...

  5. 毕业设计Java企业车辆管理系统设计与实现源码+论文+视频

    通过计算机,能够直接"**"车辆使用情况,数据计算自动完成,尽量减少人工干预,可以使用车信息更加规范化.透明化.因此,开发一套高效率,无差错的企业车辆管理系统软件十分必要,因此设计 ...

  6. [附源码]java+ssm计算机毕业设计基于Java的藏文学习软件n61lu(源码+程序+数据库+部署)

    项目运行 项目含有源码(见文末).文档.程序.数据库.配套开发软件.软件安装教程 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ E ...

  7. 【计算机毕业设计】Java ssm XX活动报名系统(源码+论文)

    毕设帮助.技术解答.源码获取(有偿)见文末 系统概述 随着互联网逐渐走进大众视野,针对网上活动报名的方式越来越受到人们的青睐,基于互联网的通用活动报名系统能够实现活动报名管理的系统化.保密化.智能化, ...

  8. 基于java web的在线考试系统(源码+论文)

    今天介绍的一个项目是, 基于java web的在线考试系统 1 设计内容及要求 1.1 在线考试系统概述 基于Java web开发的在线考试系统不仅可以充分利用校园内各种资源,对学校的各种教学资源进行 ...

  9. 【计算机毕业设计】Java ssm 高校运动会管理系统(开题+源码+论文)

    毕设帮助.开题指导.技术解答.源码交流,联系方式见文末 如今高校开展校园运动会已经成为每年不必可少的活动,运动会越来越受到高校师生的欢迎,但是大多数高校运动会从参赛报名到成绩统计等环节都是停留在纸质文 ...

最新文章

  1. ASP.NET在IE10中Form表单身份验证失效问题解决方法
  2. 计算机病毒洛,蓝狐动漫《百变机兽》中未完的战争,蓝毒兽原来是电脑病毒?...
  3. 面向对象PHP之静态延迟绑定
  4. 前端学习(973):移动端其他插件使用
  5. 安装ubuntu出现花屏_电脑显卡花屏怎么办?电脑独立显卡花屏的原因和解决方法...
  6. 进程 线程 多进程 多线程 父进程 子进程
  7. 超级玛丽游戏(洛谷-P1000)
  8. 2019年python黑马_决心在2019年让Python成为您的朋友
  9. Windows安装Redis 详细教程——《Redis入门》
  10. 将网址url中的参数转化为JSON格式的两种方法
  11. 应聘计算机程序员英文,计算机程序员英文简历模板
  12. 蓝桥杯 平方和(JAVA)
  13. java 同比数据怎么算的_有当日数据和去年全年数据,如何通过公式做每日同比?...
  14. Serverlet简介及理解
  15. ZDNS参与的《根服务器运行机构不端行为研究报告》正式发布,全球根服务器安全治理又进一步
  16. 百度搜索URL参数你知道多少
  17. html美食网站项目案例,11个美味的餐厅和美食网站案例
  18. 如何识别MOS管符号和箭头
  19. 基于Small及Weex的定制化APP方案
  20. vscode安装c/c++编译器

热门文章

  1. [c语言]进值转换的详细代码实现(二进制,十进制,十六进制等)
  2. 中级认证宝典【全理论】
  3. 易语言传文本到c 崩溃,win7系统易语言打开支持库配置就崩溃的解决方法
  4. 推荐 2 个 Spring Boot 工作流项目,轻松搞定工作流!
  5. IAR for ARM系列教程(四)_菜单(Ⅱ)
  6. 实用!!服务器监测邮箱报警
  7. java onmouseover_第8天:javascriptDOM小 案例、onmouseover 、onmouseout
  8. Heap的讲解 - 介绍
  9. 将列表(含字典)数据写入Excel
  10. JAVA方法SQL语句执行顺序