基于RMI和Socket的Java聊天软件

本文记录了一款基于Java的聊天软件开发过程,使用RMI和Socket进行服务器与客户端通信,同时整合了MySQL数据库。在服务器端,RMI定义远程接口供客户端调用,Socket用于检测用户登录状态并保持连接。客户端通过RMI调用各种功能,如登录、发消息等。项目已部署到服务器,客户端部分未详细介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java期末大作业,总算肝完了。这学期才开始接触Java,比起C语言java用起来不要太舒服。期末大作业就想着做一个能用的东西出来,于是就选了这个,经过小组成员的努力,最终还是把这玩意儿弄出来了。

服务器端:

采用RMI和Socket实现服务器端与客户端通信
关于RMI
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

java大作业总算肝完了。这一路走过来遇到很多问题,也有很多收获,写下本篇博客来记录。一个学期从一个没有接触过java的小白,到学会java网络编程,多线程等方面知识,再到成功讲软件部署到服务器上,这一路真的很艰辛。


一、功能介绍及环境

效果展示:demo
代码链接:src
功能就以上视频里展示的这些。
如果有需要请在评论区留言
java做可视化真的拉跨
jdk8
mysql 8(这个不同所需要的mysql-connector的jar包也不同)

二、服务器端

服务器端采用RMI和Socket与客户端通信

1.RMI

RMI定义远程方法提供给客户端调用

定义的接口:(需要实现


import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;

public interface ServerMethod extends Remote {
   
   
    /**
     *RMI方法
     * 登录 登录成功返回true 否则返回false
     * @param   UID  用户UID
     * @param   Password 用户密码
     * @see boolean
     */
    public boolean Login(String UID,String Password) throws RemoteException, SQLException;//登录
    /**
     *RMI方法
     * 注册 注册成功返回true 否则返回false
     * @param   UID  用户UID
     * @param   Password 用户密码
     * @param Nickname 昵称
     * @see boolean
     */
    public boolean Register(String UID ,String Password,String Nickname)throws SQLException,RemoteException;//注册
    /**
     *RMI方法
     * 获取存在数据库的未读消息
     * @param   UID  用户UID
     * @see ArrayList
     */
    public ArrayList<String> getDBMessage(String UID) throws SQLException,RemoteException;//获取存储在数据库的消息
    /**
     *RMI方法
     * 获取好友列表
     * @param   UID  用户UID
     * @see ArrayList
     */
    public ArrayList<String> getAllFriends(String UID) throws SQLException,RemoteException;//获取好友列表 格式: UID:Nickname
    /**
     *RMI方法
     * 发送消息
     * @param   UID  发送者UID
     * @param Nickname 昵称
     * @param  ReceiveID 接收者ID
     * @param content  内容
     * @see ArrayList
     */
    public boolean SendMessage(String UID,String Nickname,String ReceiveID,String content) throws SQLException,RemoteException;//对方还不是好友,则发送失败
    /**
     *RMI方法
     * 获取实时消息
     * @param   UID  用户UID
     * @see ArrayList
     */
    public  ArrayList<String> GetMessage(String UID) throws Exception;//实时消息获取
    /**
     *RMI方法
     * 发送群聊消息 发送成功返回true
     * @param   UID  发送者UID
     * @param   Nickname 昵称
     * @param   GroupUID 群组UID
     * @param   content 内容
     * @see boolean
     */
    public boolean SendMessageToGroup(String UID,String Nickname,String GroupUID,String content)throws SQLException,RemoteException;//向群聊发送消息
    /**
     *RMI方法
     * 发送群聊消息 发送成功返回true
     * @param   SendUID  发送者UID
     * @param   Nickname 昵称
     * @param   ReceiveUID 接收者UID
     * @param   content 内容
     * @see boolean
     */
    public boolean AddFriendsRequest(String SendUID,String ReceiveUID,String Nickname,String content)throws SQLException,RemoteException;//发送添加好友请求
    /**
     *RMI方法
     * 删除关系
     * @param   ID1 ID2
     * @param   ID2 ID1
     */
    public void DeleteFriend(String ID1,String ID2)throws SQLException,RemoteException;//删除关系
    /**
     *RMI方法
     * 新建群聊
     * @param   SendUID ID2
     * @param   GID ID1
     */
    public boolean NewGroup(String SendUID,String GID)throws SQLException,RemoteException;//新建群聊
    /**
     *RMI方法
     * 添加群聊
     * @param   UID 用户ID
     * @param   GID 群聊ID
     */
    public void AddGroup(String UID,String GID)throws SQLException,RemoteException;//添加群聊 无需验证
    /**
     *RMI方法
     * 修改昵称
     * @param   UID 用户ID
     * @param   newNickname 新用户昵称
     * @see     boolean
     */
    public boolean ChangeNickname(String UID,String newNickname)throws SQLException,RemoteException;//修改昵称
    /**
     *RMI方法
     * 修改密码
     * @param   UID 用户ID
     * @param   newPassword 新密码
     * @see     boolean
     */
    public boolean ChangePassword(String UID,String newPassword)throws SQLException,RemoteException;//修改密码
    /**
     *RMI方法
     * 获取用户消息
     * @param   UID 用户ID
     */
    public String getUserInfo(String UID)throws SQLException,RemoteException;//获取用户信息 若为群组返回 G:GID 若为用户返回 U:UID:Nickname
    /**
     *RMI方法
     * 同意添加好友
     * @param   SendUID 发送者ID
     * @param   ReceiveUID 接收者UID
     */
    public  void AgreeAddFriendRequest(String SendUID,String ReceiveUID)throws SQLException,RemoteException;
    /**
     *RMI方法
     * 拒绝添加好友
     * @param   SendUID 发送者ID
     * @param   ReceiveUID 接收者UID
     */
    public  void RefuseAddFriendRequest(String SendUID,String ReceiveUID)throws SQLException,RemoteException;
}

RMI这部分真的不好配置,由于需要外网ip,一开始没有服务器,用的是内网穿透(花生壳和网穿云各可以白嫖一个端口),结果出现了一堆问题
这里是配置相关的代码:

System.setProperty("java.rmi.server.hostname","3956w07c04.wicp.vip");//外网域名
  try {
   
   
            RMISocketFactory.setSocketFactory(new SMRMISocket());
            } catch (Exception ex) {
   
   
            }
             ServerMethod method = new ServerMethodImpl(DB);//RMI方法
             LocateRegistry
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值