面向对象综合程序设计课程设计--聊天室

一、项目简介

功能描述:实现了使用Sockect简易的聊天室功能,用Swing和awt进行客户端聊天,登录,注册界面的图形化,用MYSQL数据库实现了用户信息存储。用户可向指定的用户发送信息

二、功能架构图或主要功能流程图

三、个人任务简述

1. 完成的任务与功能

以表格形式描述将自己完成的有特色的地方、重难点地方。

序号

完成功能与任务

描述

1

聊天服务器搭建

使用Serversocket进行服务器的搭建

2

聊天客户端搭建

使用了面向对象技术设计系统。

3

服务器与客户端交互

客户端与服务器根据一定的规范进行信息交互

4

登录注册功能

使用了DAO模式。使用了MYSQL数据库

5

数据库设计

采用MySQL数据库。表设计符合第三范式。

2. Git提交记录截图:

四、本人负责功能详解

1.面向对象设计

聊天室的设计,进入聊天室时需要先登录或注册,考虑到聊天时需要显示在线的用户,和对多个在线的用户进行聊天。Server类提供端口监听,把SeverThread分配给客户端,ServerThread类实现对Client客户端的交互提供向聊天服务。

2.聊天客户端搭建

客户端更新自己的在线用户列表,通过服务器的content确定需更新的在线列表

服务器消息例子:OnlineListUpdate/小猫&192.168.125.15:52140,小高&192.168.125.15:52155

private static void OnlineListUpdate(String content,ClientFrame cframe) throws UnknownHostException {
        
        DefaultTableModel tbm = (DefaultTableModel) cframe.jtbOnline.getModel();
       
        tbm.setRowCount(0);
        
        String[] onlinelist = content.split(",");
       
        for(String member : onlinelist)
        {
            String[] tmp = new String[3];
           
            if(member.substring(member.indexOf("&")+1).equals(InetAddress.getLocalHost().getHostAddress() + ":" + s.getLocalPort()))
                continue;
            tmp[0] = member.substring(0,member.indexOf("&"));
            tmp[1] = member.substring(member.indexOf("&")+1, member.indexOf(":"));
            tmp[2] = member.substring(member.indexOf(":") + 1);
           
            tbm.addRow(tmp);
        }
        
        DefaultTableCellRenderer tbr = new DefaultTableCellRenderer();
        
        tbr.setHorizontalAlignment(JLabel.CENTER);
        cframe.jtbOnline.setDefaultRenderer(Object.class, tbr);
    }

 客户端更新自己的聊天框,通过服务器的content确定需更新的聊天框信息

服务器消息例子:Chat/小高&192.168.125.15:52155/你好小猫

  private static void Chat(String content,ClientFrame cframe) {
        System.out.println(content);
        String name=content.substring(0,content.indexOf("&"));
        String sender = content.substring(content.indexOf("&")+1, content.indexOf("/"));
        String word = content.substring(content.indexOf("/") + 1);
       
        cframe.jtaChat.append(cframe.sdf.format(new Date()) + " \n来自 " + name + ":" + word + " \n");
        
        cframe.jtaChat.setCaretPosition(cframe.jtaChat.getDocument().getLength());
    }

3.聊天服务器搭建

    String ip = null;
   
    int port = 0;
    
    String uid = null;

    static ArrayList<String> uid_arr = new ArrayList<String>();
    
    static HashMap<String, ServerThread> hm = new HashMap<String, ServerThread>();
   
    static HashMap<String,String> hm2=new HashMap<>();
    public ServerThread(Socket s, ServerSocket ss, String ip, int port)
    {
        this.s = s;
        this.ss = ss;
        this.ip = ip;
        this.port = port;
        uid = ip + ":" + port;
    }

服务器通过ServerSocket监听,ServerThread为请求连接的客户端分配线程,uid为IP+":"+端口,将线程放进uid_arr中,hm将线程与uid名对应起来,hm2将uid于网名对应起来

当服务器监听到一个连接后或一个客户端断开连接后,向客户端发送在线列表的更新

public void updateOnlineList(OutputStream out) throws Exception
    {
        for(String tmp_uid : uid_arr)
        {
           
            out = hm.get(tmp_uid).s.getOutputStream();
            
            StringBuilder sb = new StringBuilder("OnlineListUpdate/");
            for(String member : uid_arr)
            {   String name=hm2.get(member);
                sb.append(name+"&"+member);
                
                if(uid_arr.indexOf(member) != uid_arr.size() - 1) {
                    sb.append(",");
                }
            }
            out.write(sb.toString().getBytes());
        }
    }

 当服务器接收到客户端聊天请求时,向客户端指定的用户发送聊天内容

public void chatOnlineList(OutputStream out, String uid, String[] receiver_arr, String word) throws Exception
    {
        for(String tmp_uid : receiver_arr)
        {
            
            out = hm.get(tmp_uid).s.getOutputStream();
           
            String name=hm2.get(uid);
            out.write(("Chat/" +name+"&"+ uid + "/" + word).getBytes());
        }
    }

4.登录和注册

通过JDBC与数据库交互判断是否登录成功,成功后进入聊天界面,以及注册时用户名有无重复

String pwd = new String(password.getPassword());
            if(udji.validatePassword(user.getText(), pwd)){
                //登录成功,登录界面不可见
                jFrame.setVisible(false);
                Client.name= user.getName();

                try {
                    OutputStream os=s.getOutputStream();
                    os.write(("Name/"+user.getText()+"&"+myUid).getBytes());

                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }

                cframe.setVisible(true);

            }else{
                //用户名错误
                JOptionPane.showMessageDialog(jFrame,"用户名错误或密码错误","提示",JOptionPane.INFORMATION_MESSAGE);
                //将用户名和密码置空
                user.setText("");
                password.setText("");
            }
if (username == null || "".equals(username)) {
                JOptionPane.showMessageDialog(contentPane, "请输入账号", "系统提示", JOptionPane.WARNING_MESSAGE);
            } else if (password == null || "".equals(password)) {
                JOptionPane.showMessageDialog(contentPane, "请输入密码", "系统提示", JOptionPane.WARNING_MESSAGE);
                //检查用户名是否重
            } else if (udji.getUserByName(username)==false) {
                if (username.isEmpty() && password.isEmpty()) {
                    JOptionPane.showMessageDialog(null, "请输入用户名和密码!", "提示消息", JOptionPane.WARNING_MESSAGE);
                } else {
                    udji.writeUser(username,password);
                    JOptionPane.showMessageDialog(null, "注册成功!", "提示消息", JOptionPane.WARNING_MESSAGE);
                    dispose();
                }
            } else {
                JOptionPane.showMessageDialog(contentPane, "用户名已存在", "系统提示", JOptionPane.WARNING_MESSAGE);
                usernameText.setText("");
                passwordText.setText("");
            }

五、运行截图

六、课程设计总结及展望

总结:深入学习了Java网络编程的相关知识,掌握了TCP协议的工作原理以及如何在Java中实现Socket通信。我们还学习了多线程编程,使聊天室能够同时处理多个客户端连接。

展望:没有实现文件传输的功能。聊天室的功能比较简单,没有考虑用户界面的美观。在设计过程中,我们没有考虑到安全性问题,例如数据加密等。

七、课程设计感想

在实现聊天室功能的过程中,我遇到了许多困难和挑战。如何实现多用户同时在线聊天、如何处理各种异常情况等。通过不断尝试和调整,我逐渐找到了解决问题的方法,这让我非常有成就感。

八、参考文献

黑马程序员Java零基础视频教程_下部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java课程设计题目 一、课程设计总体要求: 本次课程设计是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回 顾和实践,因此,开始设计前学生一定要先回顾以前所学的内容,明确本次作业设计所要用 到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基于JA V A的应用系统综合实例,来掌握Java语言编程技巧。 二、参考题目及要求: 1、编写一个记事本程序 要求: 用图形用户界面实现。 能实现编辑、保存、另存为、查找替换等功能。 提示:使用文件输入输出流。 2、模拟马匹赛跑 要求: 用图形用户界面实现。 能设置比赛时间,马匹的数量等等。 在任意时间段内马匹的速度是随机的。 开始比赛之后以动画显示赛马过程。 提示:使用多线程 3、学生信息管理系统 要求: 使用图形用户界面 用数据库建立1或2个学生信息表。(不限使用哪种数据库 能连接数据库并实现查询、增、删、改等功能。 4、图书信息管理系统 要求: 使用图形用户界面 用数据库建立1或2个图书信息表。(不限使用哪种数据库 能连接数据库并实现查询、增、删、改等功能。 5、聊天小程序 要求: 使用图形用户界面。 能实现一个聊天室中多人聊天。 可以两人私聊。 提示:使用socket通信 6、ATM柜员机模拟程序 要求:使用图形用户界面。当输入给定的卡号和密码(初始卡号和密码为123456时,系 统能登录ATM柜员机系统,用户可以按照以下规则进行: 1、查询余额:初始余额为10000元 2、A TM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。 3、A TM存款:不能出现负存款。 4、修改密码:新密码长度不小于6位,不允许出现6位完全相同的情况,只有旧密码正确 ,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。 7、超市收银系统 要求:使用图形用户界面。 由收银员输入顾客的会员卡卡号(若有卡、所购商品的货号等。从数据库中取出有关 价格信息,再把这些信息返回给收银台。同时把该收银台的销售总量和有关种类商品的剩 余量以及该持卡顾客的消费情况交数据库存储以供查询。 另外,对没有卡的消费情况不记录该顾客的消费情况等个人信息。如果一个未持卡顾 客一次购物满200元,可为其发放一张会员卡,以后在该商场购物可向9折优惠。 8、万年历 要求: 使用图形用户界面。 实现日期与星期的查询 9、网络监听程序 要求: 使用图形用户界面。 有服务器和客户端,服务器监听客户端的登陆。即:如果A客户端登陆服务器,则服务器 界面上的A字母对应的红灯变成绿色。 绿灯表示连接,红灯表示断线。 提示:socket的监听方法 10、全球通计费程序 要求: 使用图形用户界面。 使用真实的全球通资费标准,模拟统计一个特定号码的一个月的实时话费。 能根据输入实现各种用户的话费的计算并显示月实时帐单。 提示:使用接口和多个子类实现分别表示金卡、银卡等各种套餐的话费计算。 11.日历记事本 要求:带有日程提醒功能的日历。 1、显示信息:用户可以向前翻页查询前一个月的日期,也可以向后翻页查询下一个月 的日期。 2、定时提醒:用户可以针对某一天来添加,删除和编辑这一天的日程提醒信息,当系统 时间和提醒时间相吻合时,给出具有提示信息的对话框。 3、查询信息:用户可以查询到某个月的所有的提示信息。 12.电子英汉词典 要求: 能够编辑词典库中的信息 能够实现英译汉,汉译英。(要考虑一词多义 13.加密与解密 要求:采用图形用户界面 1、给定任意一个文本文件,进行加密,生成另一个文件。 2、对加密后的文件还原。 14.小游戏 要求:。 程序随机产生20—50根火柴,由人与计算机轮流拿,每次拿的数量不超过3根,拿到最后 一根为胜。(使用图形界面 15.敏感词汇分析 要求: 任意选择一个文本文件,分析该文件,如果存在敏感词汇(这些词汇保存在sentive.tx t文件中,每个词占一行,报告每个词出现的次数。 16、猜数字游戏 要求:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到, 给出所用时间和评语。 要求提交Application和Applet两个版本的程序。 17、小学算术运算测试程序 要求:制作一个可供小学数学运算程序:10以内加减法,能根据输入题数出题,判断做题 是否正确,最后计算分数。 要求提交Application和Applet两个版本的程序。 18、模拟科学计算器 要求:界面模拟Windows中的计算器程序。 实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数运算。 实现要点:添加相关组件并进行按钮事件处理。 要求提交Application和Applet两个版本的程序。 19、模拟画图 要求:模拟Windows中的画图程序,实现图形图像
基于TCP的网络聊天程序设计可以使用套接字(socket)和多线程(thread)来实现。下面是一个简单的示例: 1. 服务器端代码: ```python import socket import threading # 创建套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8888)) server_socket.listen(5) # 客户端处理函数 def handle_client(client_socket, client_address): while True: data = client_socket.recv(1024).decode() if not data: break # 处理接收到的数据 # ... client_socket.close() # 接受客户端连接并创建线程处理 while True: client_socket, client_address = server_socket.accept() client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start() ``` 2. 客户端代码: ```python import socket # 创建套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 8888)) # 发送消息 while True: message = input("请输入消息:") client_socket.send(message.encode()) client_socket.close() ``` 这个示例中,服务器端使用`socket`模块创建套接字,并通过`bind`方法绑定到指定的IP地址和端口。然后使用`listen`方法监听客户端连接。当有客户端连接时,创建一个新的线程来处理客户端的请求。在处理函数中,使用`recv`方法接收客户端发送的消息,并进行相应的处理。 客户端使用`socket`模块创建套接字,并使用`connect`方法连接到服务器的IP地址和端口。然后通过`send`方法发送消息给服务器。 注意:以上示例只是一个简单的框架,实际的网络聊天程序还需要添加更多的功能,如用户注册、用户登录、显示在线用户等。具体的实现方式可以根据需求进行设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值