加文末微信,获取正文+源码:
👍 可作为课程设计和毕业论文设计的参考;
👭 查看文末<微信号>1对1马上沟通;
📝 选题、开题报告、任务书、正文、图纸、程序全都有;
🌈 全学科1对1咨询,承接各种定制系统,有问题可以留言咨询,帮助到更多的人。
基于Java的聊天室系统的设计与实现(论文+源代码+辅导视频+答辩PPT+任务书+开题报告)课程设计论文模板
一、程序简介
随着信息科学技术的飞速发展,人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了公司合同管理系统的开发设计过程。软件采用JSP开发技术,Tomcat作容器, SQL Server 2000作数据库管理系统,实现了创建合同、修改合同、删除合同、合同收款提醒、合同时间管理、合同查询等几大功能。。软件符合公司合同管理的需求,能够帮助公司切实提高工作效率。软件的开发符合一般管理软件的开发流程,对开发其他类似的管理软件具有相当的参考价值。
论文组织如下:首先阐述了该系统的开发背景、意义;其次介绍了相关的理论基础;接着对系统的需求进行了分析,并提
计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有了日新月异的发展,它的发展速度和计算机的发展速度一样的恐怖,从出现一直到现在,它已经在人们的生活的各个方面发挥着自己的作用,而且是不可替代的作用。因为计算机发展到现在已经成为一种廉价的生活物品,可以预想到未来人们都会使用计算机,上网的人也会逐渐增多,会有不断的人完善和更新出更好更棒的互联网服务,来提高自己的生活水平。我国近几年经济和社会在不断的发展,互联网也得到了广大的支持,网络更是已经融入了广大人民的日常生活。在计算机编程方面,互联网软件开发逐步转向以java为首的面向对象的编程技术,传统的面向过程的编程技术已经逐渐退出了历史的舞台,java正以不可思议的速度发展。人们日常的生活,教育,网银,网购,面对面的网上视频,以及现在逐渐被大众接受的网络游戏都在使用面向对象的技术。而且java自身的优势以及特点能够真正减少了企业的开发成本和开发人员的开发时间和难度。
在以前,人们获取信息的方式十分单一,通过电视,广播,信件以及人们的口头相传,这种方式效率十分的底下,得到的信息也很局限。现阶段上网查找成为人们获取信息的主要途径,它具有快速,方便,以及传递的特点。所以人们对网上的即时面对面聊天产生了需要。一个界面清新,简单,并且高效的网络聊天室一定会受到大众的喜爱。为了这个目的,构建此聊天系统。
出了具体的设计方案;然后展现了系统各功能模块的实现;最后对该软件进行了严格的测试。
二、部分程序图片
4.1 项目概述
我自己的这个聊天室目前来说还是十分的简单,和市面上那些已经成熟的网络聊天室相比还是差别很大的,但是基本的聊天功能也是能够使用的,整个界面简洁,使用起来也十分方便。
4.2 网络聊天室系统的设计
5 系统详细设计
5.1 服务器模块设计
服务端的功能主要如下:
一:能够开启和关闭服务器。
二:等待着客户端从特殊端口发送的请求。
三:监听的端口并不是固定的,服务端的端口是能够自定义的。
四:能够广播消息向所有连接到服务器的用户。
客户端和服务器之间通过socket套接字进行连接,socket的使用在java当中并不复杂,十分的简单。API提供了一个专门的类来处理,让编写程序变得十分简单。多线程的技术在服务器端得到了充分的体现,服务器能够同时处理来自不同IP的客户端的请求。通过循环调用serversocket对象的方法来监听是否有来自客户端的请求。
5.2 客户端模块设计
客户端的功能主要如下:
一:能够和服务端进行连接。
二:新的用户能够注册账号。
三:通过用户名以及密码完成用户的登陆,连接到聊天室。
四:用户能够在聊天室发送消息。
客户端通过socket与服务器建立连接。通过java对象的流来进行信息的传递,服务器接受请求返回对象,然后返回给客户端信息。不同的客户端的信息在服务端能够进行不同的处理。
6 系统测试
6.1 单元测试
一般来说,在软件的开发中,每当一个基本功能能够实现之后会由程序员先进行测试。一般来说要根据实际的情况来看这个功能是否完整,要验证接口的设计是否和设计书上面的一直。这就是基本的单元测试。单元测试并不是光测试接口的功能就可以了,程序员应该对测试结果进行预计的评估,看实际的结果和预计的结果是否相同,还有对可能发生的所有错误进行测试和处理。单元测试总的来说就是要测试最小的功能模块,与程序其他部分隔离的情况下进行测试,保证最低级的功能没有问题。
6.2 系统测试
系统测试就是对软件的全面的测试,主要是为了测试各个模块之间的数据的通行以及整个软件的运行是否达到了用户的要求。而且要求具体的测试报告来评判软件的好坏。系统测试不应该仅仅测试软件,而是要软硬件结合一起进行测试,需要专业的测试人员根据实际的用户需求制定有效的测试计划才行。而且系统测试不应该在软件项目的最后进行,应当在软件开发过程中周期性的进行。
三、论文文档
![](https://i-blog.csdnimg.cn/direct/952b6275cd8a426391d2fa45abeadc4e.png)
四、源码示例
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");
}
}
加文末微信,获取正文+源码:
👍 可作为课程设计和毕业论文设计的参考;
👭 查看文末<微信号>1对1马上沟通;
📝 选题、开题报告、任务书、正文、图纸、程序全都有;
🌈 全学科1对1咨询,承接各种定制系统,有问题可以留言咨询,帮助到更多的人。
👭 查看下方<微信号>1对1马上沟通;
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓