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

谁践踏了优雅 2024-03-30 10:13 150阅读 0赞

文章目录

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

前言

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

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


一、项目设计

1. 模块设计

在这里插入图片描述
在这里插入图片描述

服务器模块设计

服务端的功能主要如下:

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

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

客户端模块设计

客户端的功能主要如下:

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

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

2. 实现效果

服务器界面
在这里插入图片描述
登录界面
在这里插入图片描述

在这里插入图片描述

用户聊天界面
在这里插入图片描述

二、部分源码

部分代码示例:

  1. import javax.swing.*;
  2. import javax.swing.event.ChangeEvent;
  3. import javax.swing.event.ChangeListener;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import java.net.*;
  7. import java.io.*;
  8. import java.util.*;
  9. public class ChatRoom extends Thread implements ActionListener {
  10. static JFrame frmChat;
  11. JPanel pnlChat;
  12. JButton btnCls, btnExit, btnSend, btnClear, btnSave;
  13. JLabel lblUserList, lblUserMessage, lblSendMessage, lblChatUser;
  14. JLabel lblUserTotal, lblCount, lblBack;
  15. JTextField txtMessage;
  16. java.awt.List lstUserList;
  17. TextArea taUserMessage;
  18. JComboBox cmbUser;
  19. JCheckBox chPrivateChat;
  20. String strServerIp, strLoginName;
  21. Thread thread;
  22. final JLabel headLabel = new JLabel();
  23. Dimension scrnsize;
  24. Toolkit toolkit = Toolkit.getDefaultToolkit();
  25. Message messobj = null;
  26. String serverMessage = "";
  27. // ���췽��
  28. public ChatRoom(String name, String ip) {
  29. strServerIp = ip;
  30. strLoginName = name;
  31. frmChat = new JFrame("������" + "[�û�:" + name + "]");
  32. pnlChat = new JPanel();
  33. frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  34. frmChat.getContentPane().add(pnlChat);
  35. Font fntDisp1 = new Font("����", Font.PLAIN, 12);
  36. String list[] = {
  37. "������" };
  38. btnCls = new JButton("����");
  39. btnExit = new JButton("�˳�");
  40. btnSend = new JButton("����");
  41. btnSave = new JButton("����");
  42. lblUserList = new JLabel("�������û��б���");
  43. lblUserMessage = new JLabel("��������Ϣ��");
  44. lblSendMessage = new JLabel("��������:");
  45. lblChatUser = new JLabel("���:");
  46. lblUserTotal = new JLabel("��������:");
  47. lblCount = new JLabel("0");
  48. lstUserList = new java.awt.List();
  49. txtMessage = new JTextField(170);
  50. cmbUser = new JComboBox(list);
  51. cmbUser.addItemListener(new ItemListener() {
  52. public void itemStateChanged(ItemEvent arg0) {
  53. freshHead();
  54. }
  55. });
  56. chPrivateChat = new JCheckBox("˽��");
  57. taUserMessage = new TextArea("", 300, 200,
  58. TextArea.SCROLLBARS_VERTICAL_ONLY);// ֻ�����¹���
  59. taUserMessage.setForeground(new Color(0, 0, 0));
  60. taUserMessage.setEditable(false); // �����
  61. pnlChat.setLayout(null);
  62. pnlChat.setBackground(new Color(52, 130, 203));
  63. btnSave.setBounds(500, 330, 80, 25);
  64. btnCls.setBounds(400, 330, 80, 25);
  65. btnExit.setBounds(500, 360, 80, 25);
  66. btnSend.setBounds(500, 300, 80, 25);
  67. lblUserList.setBounds(5, 0, 120, 40);
  68. lblUserTotal.setBounds(130, 0, 60, 40);
  69. lblCount.setBounds(190, 0, 60, 40);
  70. lblUserMessage.setBounds(225, 0, 180, 40);
  71. lblChatUser.setBounds(10, 290, 40, 40);
  72. lblSendMessage.setBounds(210, 290, 60, 40);
  73. lstUserList.setBounds(5, 40, 210, 255);
  74. taUserMessage.setBounds(225, 40, 360, 255);
  75. txtMessage.setBounds(270, 300, 210, 25);
  76. cmbUser.setBounds(50, 300, 80, 25);
  77. chPrivateChat.setBounds(333, 336, 60, 20);
  78. btnCls.setFont(fntDisp1);
  79. btnExit.setFont(fntDisp1);
  80. btnSend.setFont(fntDisp1);
  81. btnSave.setFont(fntDisp1);
  82. lblUserList.setFont(fntDisp1);
  83. lblUserMessage.setFont(fntDisp1);
  84. lblChatUser.setFont(fntDisp1);
  85. lblSendMessage.setFont(fntDisp1);
  86. lblUserTotal.setFont(fntDisp1);
  87. lblCount.setFont(fntDisp1);
  88. cmbUser.setFont(fntDisp1);
  89. chPrivateChat.setFont(fntDisp1);
  90. lblUserList.setForeground(Color.YELLOW);
  91. lblUserMessage.setForeground(Color.YELLOW);
  92. lblSendMessage.setForeground(Color.black);
  93. lblChatUser.setForeground(Color.black);
  94. lblSendMessage.setForeground(Color.black);
  95. lblUserTotal.setForeground(Color.YELLOW);
  96. lblCount.setForeground(Color.YELLOW);
  97. cmbUser.setForeground(Color.black);
  98. chPrivateChat.setForeground(Color.black);
  99. lstUserList.setBackground(Color.white);
  100. taUserMessage.setBackground(Color.white);
  101. btnCls.setBackground(Color.ORANGE);
  102. btnExit.setBackground(Color.ORANGE);
  103. btnSend.setBackground(Color.PINK);
  104. btnSave.setBackground(Color.ORANGE);
  105. pnlChat.add(btnCls);
  106. pnlChat.add(btnExit);
  107. pnlChat.add(btnSend);
  108. pnlChat.add(btnSave);
  109. pnlChat.add(lblUserList);
  110. pnlChat.add(lblUserMessage);
  111. pnlChat.add(lblSendMessage);
  112. pnlChat.add(lblChatUser);
  113. pnlChat.add(lblUserTotal);
  114. pnlChat.add(lblCount);
  115. pnlChat.add(lstUserList);
  116. pnlChat.add(taUserMessage);
  117. pnlChat.add(txtMessage);
  118. pnlChat.add(cmbUser);
  119. pnlChat.add(chPrivateChat);
  120. frmChat.addWindowListener(new Windowclose());
  121. btnCls.addActionListener(this);
  122. btnExit.addActionListener(this);
  123. btnSend.addActionListener(this);
  124. btnSave.addActionListener(this);
  125. lstUserList.addActionListener(this);
  126. txtMessage.addActionListener(this);
  127. headLabel.setHorizontalAlignment(SwingConstants.CENTER);
  128. headLabel.setIcon(new ImageIcon("face//1.JPG"));
  129. headLabel.setBounds(15, 335, 70, 60);
  130. pnlChat.add(headLabel);
  131. // ��������ҳ����Ϣˢ���߳�
  132. Thread thread = new Thread(this);
  133. thread.start();
  134. frmChat.setSize(600, 420);
  135. frmChat.setVisible(true);
  136. frmChat.setResizable(false);
  137. // �����ڶ�λ����Ļ����
  138. scrnsize = toolkit.getScreenSize();
  139. frmChat.setLocation(scrnsize.width / 2 - frmChat.getWidth() / 2,
  140. scrnsize.height / 2 - frmChat.getHeight() / 2);
  141. Image img = toolkit.getImage("images\\appico.jpg");
  142. frmChat.setIconImage(img);
  143. } // ���췽������
  144. @SuppressWarnings("deprecation")
  145. public void run() {
  146. int intMessageCounter = 0;
  147. int intUserTotal = 0;
  148. boolean isFirstLogin = true; // �ж��Ƿ�յ�½
  149. boolean isFound; // �ж��Ƿ��ҵ��û�
  150. Vector user_exit = new Vector();
  151. try {
  152. for (;;) {
  153. Socket toServer;
  154. toServer = new Socket(strServerIp, 1001);
  155. // ����Ϣ����������
  156. messobj = new Message();
  157. ObjectOutputStream streamtoserver = new ObjectOutputStream(
  158. toServer.getOutputStream());
  159. streamtoserver.writeObject((Message) messobj);
  160. // �����Է���������Ϣ
  161. ObjectInputStream streamfromserver = new ObjectInputStream(
  162. toServer.getInputStream());
  163. messobj = (Message) streamfromserver.readObject();
  164. // //ˢ��������Ϣ�б�//
  165. if (isFirstLogin) // ����յ�½
  166. {
  167. intMessageCounter = messobj.chat.size(); // ���θ��û���½ǰ����������
  168. isFirstLogin = false;
  169. }
  170. if (!serverMessage.equals(messobj.serverMessage)) {
  171. serverMessage = messobj.serverMessage;
  172. taUserMessage.append("[ϵͳ��Ϣ]��" + serverMessage+"\n");
  173. }
  174. for (int i = intMessageCounter; i < messobj.chat.size(); i++) {
  175. Chat temp = (Chat) messobj.chat.elementAt(i);
  176. String temp_message;
  177. if (temp.chatUser.equals(strLoginName)) {
  178. if (temp.chatToUser.equals(strLoginName)) {
  179. temp_message = "ϵͳ��ʾ�����벻Ҫ�������" + "\n";
  180. } else {
  181. if (!temp.whisper) // �������Ļ�
  182. {
  183. temp_message = "���㡿�ԡ�" + temp.chatToUser + "��"
  184. + "˵��" + temp.chatMessage
  185. + "\n";
  186. } else {
  187. temp_message = "���㡿���Ķԡ�" + temp.chatToUser
  188. + "��" + "˵��" + temp.chatMessage
  189. + "\n";
  190. }
  191. }
  192. } else {
  193. if (temp.chatToUser.equals(strLoginName)) {
  194. if (!temp.whisper) // �������Ļ�
  195. {
  196. temp_message = "��" + temp.chatUser + "���ԡ��㡿"
  197. + "˵��" + temp.chatMessage
  198. + "\n";
  199. } else {
  200. temp_message = "��" + temp.chatUser + "�����Ķԡ��㡿"
  201. + "˵��" + temp.chatMessage
  202. + "\n";
  203. }
  204. } else {
  205. if (!temp.chatUser.equals(temp.chatToUser)) // �Է�û����������
  206. {
  207. if (!temp.whisper) // �������Ļ�
  208. {
  209. temp_message = "��" + temp.chatUser + "���ԡ�"
  210. + temp.chatToUser + "��"
  211. + "˵��" + temp.chatMessage + "\n";
  212. } else {
  213. temp_message = "";
  214. }
  215. } else {
  216. temp_message = "";
  217. }
  218. }
  219. }
  220. taUserMessage.append(temp_message);
  221. intMessageCounter++;
  222. }
  223. // //ˢ�������û�//
  224. lstUserList.clear();
  225. for (int i = 0; i < messobj.userOnLine.size(); i++) {
  226. String User = ((Customer) messobj.userOnLine.elementAt(i)).custName;
  227. lstUserList.addItem(User);
  228. }
  229. Integer a = new Integer(messobj.userOnLine.size());
  230. lblCount.setText(a.toString());
  231. // ��ʾ�û����������ҵ���Ϣ
  232. if (messobj.userOnLine.size() > intUserTotal) {
  233. String tempstr = ((Customer) messobj.userOnLine
  234. .elementAt(messobj.userOnLine.size() - 1)).custName;
  235. if (!tempstr.equals(strLoginName)) {
  236. taUserMessage.append("��" + tempstr + "������" + "\n");
  237. }
  238. }
  239. if (messobj.userOnLine.size() < intUserTotal) {
  240. for (int b = 0; b < user_exit.size(); b++) {
  241. isFound = false;
  242. for (int c = 0; c < messobj.userOnLine.size(); c++) {
  243. String tempstr = ((Customer) user_exit.elementAt(b)).custName;
  244. if (tempstr.equals(((Customer) messobj.userOnLine
  245. .elementAt(c)).custName)) {
  246. isFound = true;
  247. break;
  248. }
  249. }
  250. if (!isFound) // û�з��ָ��û�
  251. {
  252. String tempstr = ((Customer) user_exit.elementAt(b)).custName;
  253. if (!tempstr.equals(strLoginName)) {
  254. taUserMessage.append("��" + tempstr + "������"
  255. + "\n");
  256. }
  257. }
  258. }
  259. }
  260. user_exit = messobj.userOnLine;
  261. intUserTotal = messobj.userOnLine.size();
  262. streamtoserver.close();
  263. streamfromserver.close();
  264. toServer.close();
  265. Thread.sleep(3000);
  266. }
  267. } catch (Exception e) {
  268. @SuppressWarnings("unused")
  269. JOptionPane jop = new JOptionPane();
  270. JOptionPane.showMessageDialog(null, "�������ӷ�������");
  271. e.printStackTrace();
  272. frmChat.dispose();
  273. }
  274. } // run()����
  275. private void exitChatRoom() {
  276. exit();
  277. }
  278. // /������ť��Ӧ//
  279. public void actionPerformed(ActionEvent ae) {
  280. Object source = (Object) ae.getSource();
  281. if (source.equals(btnCls)) {
  282. clearMessage();
  283. }
  284. if (source.equals(btnExit)) {
  285. exit();
  286. }
  287. if (source.equals(btnSend)) {
  288. sendMessage();
  289. }
  290. if (source.equals(btnSave)) {
  291. saveMessage();
  292. }
  293. if (source.equals(lstUserList)) // ˫���б���
  294. {
  295. changeUser();
  296. }
  297. } // actionPerformed()����
  298. // /�������ڹر���Ӧ//
  299. class Windowclose extends WindowAdapter {
  300. public void windowClosing(WindowEvent e) {
  301. exit();
  302. }
  303. }
  304. // "����"��ť
  305. public void clearMessage() {
  306. taUserMessage.setText("");
  307. }
  308. // "�˳�"��ť
  309. public void exit() {
  310. Exit exit = new Exit();
  311. exit.exitname = strLoginName;
  312. // �����˳���Ϣ
  313. try {
  314. Socket toServer = new Socket(strServerIp, 1001);
  315. // �������������Ϣ
  316. ObjectOutputStream outObj = new ObjectOutputStream(toServer
  317. .getOutputStream());
  318. outObj.writeObject(exit);
  319. outObj.close();
  320. toServer.close();
  321. frmChat.dispose();
  322. } catch (Exception e) {
  323. }
  324. } // exit()����
  325. // "����"��ť
  326. public void sendMessage() {
  327. Chat chatobj = new Chat();
  328. chatobj.chatUser = strLoginName;
  329. chatobj.chatMessage = txtMessage.getText();
  330. chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem());
  331. chatobj.whisper = chPrivateChat.isSelected() ? true : false;
  332. try {
  333. Socket toServer = new Socket(strServerIp, 1001);
  334. ObjectOutputStream outObj = new ObjectOutputStream(toServer
  335. .getOutputStream());
  336. outObj.writeObject(chatobj);
  337. txtMessage.setText(""); // ����ı���
  338. outObj.close();
  339. toServer.close();
  340. } catch (Exception e) {
  341. }
  342. }
  343. // "����"��ť
  344. public void saveMessage() {
  345. try {
  346. FileOutputStream fileoutput = new FileOutputStream(
  347. this.strLoginName + "_message.txt", true);
  348. String temp = taUserMessage.getText();
  349. fileoutput.write(temp.getBytes());
  350. fileoutput.close();
  351. JOptionPane.showMessageDialog(null, "�����¼������" + this.strLoginName
  352. + "_message.txt");
  353. } catch (Exception e) {
  354. System.out.println(e);
  355. }
  356. }
  357. // ����ѡ�û����ӵ�cmbUser��
  358. public void changeUser() {
  359. boolean key = true;
  360. String selected = lstUserList.getSelectedItem();
  361. for (int i = 0; i < cmbUser.getItemCount(); i++) {
  362. if (selected.equals(cmbUser.getItemAt(i))) {
  363. key = false;
  364. break;
  365. }
  366. }
  367. if (key == true) {
  368. cmbUser.insertItemAt(selected, 0);
  369. }
  370. String head = getUserHead(lstUserList.getSelectedItem());
  371. cmbUser.setSelectedItem(selected);
  372. headLabel.setIcon(new ImageIcon("face//" + head + ".JPG"));
  373. }
  374. protected void freshHead() {
  375. String head = getUserHead(cmbUser.getSelectedItem().toString());
  376. headLabel.setIcon(new ImageIcon("face//" + head + ".JPG"));
  377. }
  378. private String getUserHead(String selectedItem) {
  379. String head = "oo";
  380. for (int i = 0; i < messobj.userOnLine.size(); i++) {
  381. String User = ((Customer) messobj.userOnLine.elementAt(i)).custName;
  382. head = ((Customer) messobj.userOnLine.elementAt(i)).custHead;
  383. if (User.equals(selectedItem)) {
  384. break;
  385. }
  386. }
  387. return head;
  388. }
  389. public static void main(String args[]) {
  390. new ChatRoom("�����û�", "127.0.0.1");
  391. }
  392. }

项目源码

发表评论

表情:
评论列表 (有 0 条评论,150人围观)

还没有评论,来说两句吧...

相关阅读