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