JAVA 网络聊天程序设计与实现(附关键代码) 可群聊私聊发送图片

本文介绍了使用JAVA设计的网络聊天程序,支持GUI界面,包含客户端和服务器端,实现了文字、图片的发送,支持群聊和私聊。程序采用TCP协议,使用MySQL数据库存储用户信息,详细阐述了需求分析、数据库设计、界面设计及关键代码实现。
摘要由CSDN通过智能技术生成

需求分析

经分析,本程序是一个C/S结构,使用TCP协议实现聊天功能,需要实现的功能有如下几点。

  1. 本程序需要有客户端以及服务器端。
  2. 客户端应有良好的交互界面,服务器端应有转发客户端发来的消息和临时保存客户端发来的文件
  3. 本程序应支持多用户,用户可在线进行即时交流
  4. 用户端可发送文字,图片。且支持群聊和私聊
  5. 本程序登陆需要提供账号和密码,账号密码由数据库保存。
  6. 客户端提供注册功能,可选择设置自己的账号密码和昵称。

1.1客户端功能

  1. 客户端可在好友列表看到已上线的好友。
  2. 客户端可在输入框中编辑文字并且可以发送文字消息。
  3. 客户端可选择图片发送给指定好友
  4. 客户端可以进行群聊和私聊。
  5. 客户端保存服务器发来的图片文件,并显示。
  6. 客户端可显示服务器发过来的消息。

1.2服务器功能

  1. 接受文字消息并转发给指定客户端
  2. 接受并且保存客户端发来的图片并转发
  3. 每当有一个客户端连接,就给所有客户端更新好友列表
  4. 每当有一个客户端连接,就给所有客户端发送好友上线通知
  5. 每当有一个客户端离线,就给所有客户端发送好友下线通知

程序流程图

用例图

2.3.1用户用例图

用户用例图如下

2.3.2客户端用例图

2.3.3服务器端用例图

数据库设计

本程序使用mySQL数据库保存用户信息。

本程序所涉及到的表有用户表qq_user。

3.1用户表设计

如图为qq_user表的设计

数据库连接关键代码

private static String userName;

private static String password;

private static String id;



private static String connectString = "";

static {

    try {

        connectString = "jdbc:mysql://localhost:3306/qqpro";  //端口+数据库名字

        password = "123456";   //mysql账号

        userName = "root"; //mysql密码

        Class.forName("com.mysql.jdbc.Driver");

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    }



}



public static Connection getConnect() {

    try {

        return DriverManager.getConnection(connectString, userName,password);

    } catch (SQLException e) {

        e.printStackTrace();

    }

    return null;

}

界面设计

4.1.1登录界面

图4-1登陆界面

4.1.2 注册界面

图4-2注册界面

4.1.3聊天主界面

图4-3主界面

5 功能展示

启动SERVER,然后启动三次Login,打开三个客户端。

点击登录进入主界面

接着PYTHON发送一条信息给所有人

再发一条图片给所有人

再由JAVA发送一条消息给C++。双击好友栏可私聊。

再发送图片给PYTHON

</

摘 要 随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统 关键词:局域网 聊天 socket java 聊天系统各功能模块 (1)服务器程序模块 服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。 服务器线程源码: package qq.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*; import qq.dao.hibernate.IServiceDao; import qq.entity.*; public class ServerController { private User user; private Socket s; private IServiceDao dao; private ObjectInputStream ois; private ObjectOutputStream oos; private OnlineUser onlineUser; www.bylw120.com public ServerController(Socket s) { super(); dao=ServerMainClass.userDao; this.s = s; } public void handle() throws Exception { ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){ Request req=(Request)ois.readObject(); ois.read(); RequestType type=req.getType(); if(type.equals(RequestType.exit)){ exitHandle(); break; }else if(type.equals(RequestType.login)){ loginHandle(req); }else if(type.equals(RequestType.register)){ registerHandle(); }else if(type.equals(RequestType.offline)){ offlineHandle(); break; }else if(type.equals(RequestType.changeInformation)){ changeInformationHandle(); }else if(type.equals(RequestType.modifypasswd)){ modifypasswdHandle(req); }else if(type.equals(RequestType.sendMessage)){ sendMessageHandle(req); }else if(type.equals(RequestType.receiveFile)){ receiveFileHandle(req); }else if(type.equals(RequestType.sendFile)){ sendFileHandle(req); } } } private void modifypasswdHandle(Request req) { Long id=Long.parseLong(req.getData("id")); String oldpwd=req.getData("oldpwd"); String newpwd=req.getData("newpwd"); Response res=new Response(RequestType.modifypasswd); try { dao.updatePwd(id, oldpwd, newpwd); res.setData(1); try { oos.writeObject(res); } catch (IOException e) { e.printStackTrace(); } } catch (RuntimeException e) { try { oos.writeObject(res); } catch (IOException e1) { e1.printStackTrace(); } } } private void changeInformationHandle() { try { User user=(User)ois.readObject(); Response res=new Response(RequestType.changeInformation); try { dao.updateUser(user); res.setData(1);//修改成功返回值带一个整形值 oos.writeObject(res); oos.flush(); } catch (RuntimeException e) { oos.writeObject(res);//失败则返回值不带参数 oos.flush(); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void exitHandle() { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } //发送文件 private void sendFileHandle(Request req) { // try { // User u=(User)ois.readObject(); // // } catch (Exception e) { // e.printStackTrace(); // } } //接受文件 private void receiveFileHandle(Request req) {
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值