├── src └── main │ ├── java │ └── com │ │ └── easychat │ │ └── fx │ │ ├── serializer │ │ ├── SerializerAlgorithm.java │ │ ├── Serializer.java │ │ └── JsonSerializer.java │ │ ├── support │ │ ├── Attributes.java │ │ ├── request │ │ │ ├── HertBeatReq.java │ │ │ ├── LogoutReq.java │ │ │ ├── AddUserReq.java │ │ │ ├── AcceptReq.java │ │ │ ├── LoginReq.java │ │ │ ├── UpdatePasswdReq.java │ │ │ ├── RegisterReq.java │ │ │ ├── InviteGroupReq.java │ │ │ ├── CreateGroupReq.java │ │ │ ├── AcceptGroupReq.java │ │ │ ├── MessageReq.java │ │ │ └── GroupMessageReq.java │ │ ├── response │ │ │ ├── HertBeatResp.java │ │ │ ├── LogoutResp.java │ │ │ ├── RegisterResp.java │ │ │ ├── UpdatePasswdResp.java │ │ │ ├── MessageSelfResp.java │ │ │ ├── LoginResp.java │ │ │ ├── InviteGroupSelfResp.java │ │ │ ├── MessageResp.java │ │ │ ├── AddUserResp.java │ │ │ ├── GroupMessageResp.java │ │ │ ├── AddUserSelfResp.java │ │ │ ├── CreateGroupResp.java │ │ │ ├── AcceptResp.java │ │ │ ├── InviteGroupResp.java │ │ │ └── AcceptGroupResp.java │ │ ├── Packet.java │ │ ├── Session.java │ │ ├── UiBaseService.java │ │ └── Command.java │ │ ├── controller │ │ ├── AbstractController.java │ │ ├── UpdatePassword.java │ │ ├── AddUser.java │ │ ├── Cache.java │ │ ├── Login.java │ │ ├── CreateGroup.java │ │ ├── Accept.java │ │ ├── InviteGroup.java │ │ ├── MessageList.java │ │ └── Main.java │ │ ├── bean │ │ ├── AcceptCache.java │ │ ├── MessageCache.java │ │ ├── Result.java │ │ ├── Constants.java │ │ ├── Group.java │ │ ├── PageResult.java │ │ └── User.java │ │ ├── util │ │ ├── UUIdUtil.java │ │ ├── DateUtils.java │ │ ├── SessionUtil.java │ │ ├── ShowUtil.java │ │ ├── AES.java │ │ ├── FriendUtil.java │ │ ├── GroupUtil.java │ │ └── OkHttpUtils.java │ │ ├── code │ │ ├── PacketDecoder.java │ │ ├── PacketEncoder.java │ │ ├── Spliter.java │ │ └── PacketCode.java │ │ ├── service │ │ ├── config │ │ │ └── ServerConf.java │ │ ├── FileService.java │ │ ├── MessageService.java │ │ ├── UserService.java │ │ ├── ImageService.java │ │ └── impl │ │ │ ├── FileServiceImpl.java │ │ │ └── MessageServiceImpl.java │ │ └── client │ │ ├── handle │ │ ├── IMIdleStateHandler.java │ │ ├── HeartBeatRespHandler.java │ │ ├── AddUserRespHandler.java │ │ ├── InviteGroupRespHandler.java │ │ ├── UpdatePasswordRespHandler.java │ │ ├── AcceptGroupRespHandler.java │ │ ├── MessageSelfRespHandler.java │ │ ├── AcceptRespHandler.java │ │ ├── HeartBeatTimerHandler.java │ │ ├── RegisterRespHandler.java │ │ ├── AddUserSelfRespHandler.java │ │ ├── CreateGroupRespHandler.java │ │ ├── InviteGroupSelfRespHandler.java │ │ ├── LoginRespHandler.java │ │ ├── GroupMessageRespHandler.java │ │ └── MessageRespHandler.java │ │ └── Client.java │ └── resources │ ├── addUser.fxml │ ├── accept.fxml │ ├── updatePassword.fxml │ ├── login.fxml │ ├── inviteGroup.fxml │ ├── messageList.fxml │ ├── createGroup.fxml │ └── main.fxml ├── README.md ├── pom.xml ├── .gitignore └── LICENSE /src/main/java/com/easychat/fx/serializer/SerializerAlgorithm.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.serializer; 2 | 3 | public interface SerializerAlgorithm { 4 | /** 5 | * json 序列化 6 | */ 7 | byte JSON = 1; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/Attributes.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support; 2 | 3 | import io.netty.util.AttributeKey; 4 | 5 | public interface Attributes { 6 | AttributeKey SESSION = AttributeKey.newInstance("session"); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/controller/AbstractController.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.controller; 2 | 3 | import javafx.fxml.FXML; 4 | import javafx.fxml.Initializable; 5 | import javafx.scene.control.Label; 6 | 7 | public abstract class AbstractController implements Initializable { 8 | @FXML 9 | protected Label errorMsg; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/controller/UpdatePassword.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.controller; 2 | 3 | import java.net.URL; 4 | import java.util.ResourceBundle; 5 | 6 | public class UpdatePassword extends AbstractController { 7 | @Override 8 | public void initialize(URL location, ResourceBundle resources) { 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/AcceptCache.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author: Zed 7 | * date: 2019/08/28. 8 | * description: 9 | */ 10 | @Data 11 | public class AcceptCache { 12 | private String senderId; 13 | private String groupId; 14 | private String dateTime; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/MessageCache.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author: Zed 7 | * date: 2019/08/26. 8 | * description: 9 | */ 10 | @Data 11 | public class MessageCache { 12 | private String messageType; 13 | private User messageUser; 14 | private Group messageGroup; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/util/UUIdUtil.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.util; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * @author Zed 7 | * date: 2019/08/20. 8 | * description: 9 | */ 10 | public class UUIdUtil { 11 | 12 | public static String getUUid() { 13 | return UUID.randomUUID().toString().replace("-", ""); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/HertBeatReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | 4 | import com.easychat.fx.support.Command; 5 | import com.easychat.fx.support.Packet; 6 | 7 | public class HertBeatReq extends Packet { 8 | @Override 9 | public byte getCommand() { 10 | return Command.HEAT_BEAT_REQ; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/HertBeatResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | 4 | import com.easychat.fx.support.Command; 5 | import com.easychat.fx.support.Packet; 6 | 7 | public class HertBeatResp extends Packet { 8 | @Override 9 | public byte getCommand() { 10 | return Command.HEAT_BEAT_RESP; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/Packet.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author Zed 7 | * date: 2019/08/19. 8 | * description: 9 | */ 10 | @Data 11 | public abstract class Packet { 12 | private transient byte version = 1; 13 | /** 时间*/ 14 | protected String dateTime; 15 | 16 | public abstract byte getCommand(); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/LogoutResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Packet; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author Zed 8 | * date: 2019/08/19. 9 | * description: 10 | */ 11 | @Data 12 | public class LogoutResp extends Packet { 13 | @Override 14 | public byte getCommand() { 15 | return 0; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/serializer/Serializer.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.serializer; 2 | 3 | /** 4 | * @author Zed 5 | * date: 2019/08/19. 6 | * description: 7 | */ 8 | public interface Serializer { 9 | Serializer Default = new JsonSerializer(); 10 | byte getSerializerAlgorithm(); 11 | 12 | byte [] serializer(T t); 13 | 14 | T deSerializer(Class clazz, byte[] bytes); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/LogoutReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class LogoutReq extends Packet { 14 | @Override 15 | public byte getCommand() { 16 | return Command.LOGIN_RESP; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/Session.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Session { 7 | /** 用户唯一性标识*/ 8 | private String userId; 9 | private String userName; 10 | 11 | public Session(String userId, String userName) { 12 | this.userId = userId; 13 | this.userName = userName; 14 | } 15 | 16 | @Override 17 | public String toString() { 18 | return userId + ":" + userName; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/Result.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * Description: 结果 10 | * Created by Zed on 2019/01/02. 11 | */ 12 | @Data 13 | @Builder 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Result { 17 | 18 | // 结果状态 19 | private String code; 20 | // 结果消息 21 | private String desc; 22 | private T data; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/AddUserReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class AddUserReq extends Packet { 14 | /** 添加的好友 userId*/ 15 | private String addUserId; 16 | @Override 17 | public byte getCommand() { 18 | return Command.ADD_USER_REQ; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EasyChat JavaFx Client 2 | 3 | * 该应用采用JavaFx + etty框架实现,JavaFx实现了简单显示界面,Netty实现了跟后台的TCP通信 4 | 5 | ## 使用说明 6 | 1. 需要结合EasyChat Server后端一起使用 7 | 2. 按照后端的要求先将后端启动起来 8 | 3. 然后配置ServerConf类里面的后端服务器ip 9 | 4. 具体流程参考后端提供的接口文档,有较为详细的说明 10 | 11 | ## 启动说明 12 | > 环境要求:电脑拥有JDK 8及以上版本的环境,执行下面的命令 13 | ``` dos 14 | java -jar EasyChatJavaFXClient.jar 15 | ``` 16 | 17 | ## EasyChat相关开源项目 18 | 19 | #### 服务端:[EasyChatServer](https://github.com/yetel/EasyChatServer) 20 | #### Android客户端:[EasyChatAndroidClient](https://github.com/yetel/EasyChatAndroidClient) 21 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/RegisterResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class RegisterResp extends Packet { 14 | private boolean success; 15 | 16 | private String reason; 17 | @Override 18 | public byte getCommand() { 19 | return Command.REGISTER_RESP; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/AcceptReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class AcceptReq extends Packet { 14 | /** 添加好友邀请方*/ 15 | private String receiver; 16 | private boolean accept; 17 | @Override 18 | public byte getCommand() { 19 | return Command.ACCEPT_REQ; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/LoginReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class LoginReq extends Packet { 14 | /** 账号*/ 15 | private String userName; 16 | /** 密码*/ 17 | private String password; 18 | @Override 19 | public byte getCommand() { 20 | return Command.LOGIN_RRQ; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/UpdatePasswdReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class UpdatePasswdReq extends Packet { 14 | /** 旧密码*/ 15 | private String oldPassword; 16 | /** 新密码*/ 17 | private String newPassword; 18 | @Override 19 | public byte getCommand() { 20 | return Command.UPDATE_PASSWD_REQ; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/UpdatePasswdResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class UpdatePasswdResp extends Packet { 14 | private String password; 15 | private boolean success; 16 | 17 | private String reason; 18 | @Override 19 | public byte getCommand() { 20 | return Command.UPDATE_PASSWD_RESP; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/RegisterReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class RegisterReq extends Packet { 14 | /** 账号*/ 15 | private String userName; 16 | /** 密码*/ 17 | private String password; 18 | private String nickName; 19 | @Override 20 | public byte getCommand() { 21 | return Command.REGISTER_REQ; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/code/PacketDecoder.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.code; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.MessageToMessageDecoder; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/19. 12 | * description: 13 | */ 14 | public class PacketDecoder extends MessageToMessageDecoder { 15 | @Override 16 | protected void decode(ChannelHandlerContext ctx, Object msg, List out) throws Exception { 17 | out.add(PacketCode.INSTANCE.decode((ByteBuf)msg)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/code/PacketEncoder.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.code; 2 | 3 | import com.easychat.fx.support.Packet; 4 | import io.netty.buffer.ByteBuf; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.handler.codec.MessageToByteEncoder; 7 | 8 | /** 9 | * @author Zed 10 | * date: 2019/08/19. 11 | * description: 12 | */ 13 | public class PacketEncoder extends MessageToByteEncoder { 14 | @Override 15 | protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception { 16 | PacketCode.INSTANCE.encode(out, msg); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/MessageSelfResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class MessageSelfResp extends Packet { 14 | private String receiverId; 15 | private String groupId; 16 | private boolean success; 17 | private String reason; 18 | @Override 19 | public byte getCommand() { 20 | return Command.MESSAGE_SELF_RESP; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/Constants.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | /** 4 | * @author: Zed 5 | * date: 2019/08/26. 6 | * description: 7 | */ 8 | public interface Constants { 9 | String message_type_user = "message_type_user"; 10 | String message_type_group = "message_type_group"; 11 | int MAX_LINE = 2000; 12 | int PAGESIZE = 10; 13 | int CACHE_PAGESIZE = 20; 14 | String PATH = "messageCache"; 15 | String IMAGE_PATH = "imagePath"; 16 | String PATH_USER = "user"; 17 | String PATH_GROUP = "group"; 18 | 19 | int STRING_TYPE = 0; 20 | int IMAGE_TYPE = 1; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/service/config/ServerConf.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.service.config; 2 | 3 | /** 4 | * @author: Zed 5 | * date: 2019/08/26. 6 | * description: 7 | */ 8 | public interface ServerConf { 9 | String ip = "120.79.175.213"; 10 | String port = "9004"; 11 | int netty_port = 8000; 12 | String users_url = "http://ip:port/users"; 13 | String groups_url = "http://ip:port/groups"; 14 | 15 | String user_url = "http://ip:port/user/{userId}"; 16 | String group_url = "http://ip:port/group/{groupId}"; 17 | String upload_image_url = "http://ip:port/image/upload"; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/InviteGroupReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/19. 12 | * description: 13 | */ 14 | @Data 15 | public class InviteGroupReq extends Packet { 16 | /** 群Id*/ 17 | private String groupId; 18 | /** 邀请的好友*/ 19 | private List users; 20 | @Override 21 | public byte getCommand() { 22 | return Command.INVITE_GROUP_REQ; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/CreateGroupReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/19. 12 | * description: 13 | */ 14 | @Data 15 | public class CreateGroupReq extends Packet { 16 | /** 创建的群名*/ 17 | private String groupName; 18 | /** 初始化邀请的群好友*/ 19 | private List users; 20 | @Override 21 | public byte getCommand() { 22 | return Command.CREATE_GROUP_REQ; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/request/AcceptGroupReq.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.request; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class AcceptGroupReq extends Packet { 14 | /** 群id*/ 15 | private String groupId; 16 | /** 邀请人*/ 17 | private String inviterId; 18 | /** 是否接受邀请*/ 19 | private boolean accept; 20 | @Override 21 | public byte getCommand() { 22 | return Command.ACCEPT_GROUP_REQ; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/LoginResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | @Data 13 | public class LoginResp extends Packet { 14 | /** userId*/ 15 | private String userId; 16 | private String userName; 17 | private String token; 18 | private boolean success; 19 | 20 | private String reason; 21 | @Override 22 | public byte getCommand() { 23 | return Command.LOGIN_RESP; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/serializer/JsonSerializer.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.serializer; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | 5 | /** 6 | * @author Zed 7 | * date: 2019/08/19. 8 | * description: 9 | */ 10 | public class JsonSerializer implements Serializer { 11 | @Override 12 | public byte getSerializerAlgorithm() { 13 | return SerializerAlgorithm.JSON; 14 | } 15 | 16 | @Override 17 | public byte[] serializer(T t) { 18 | return JSON.toJSONBytes(t); 19 | } 20 | 21 | @Override 22 | public T deSerializer(Class clazz, byte[] bytes) { 23 | return JSON.parseObject(bytes, clazz); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/Group.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | import com.easychat.fx.controller.Cache; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author: Zed 8 | * date: 2019/08/22. 9 | * description: 10 | */ 11 | @Data 12 | public class Group { 13 | private String groupId; 14 | private String groupName; 15 | private String mainUserId; 16 | 17 | 18 | @Override 19 | public String toString() { 20 | Integer num = Cache.groupMessageNumMap.get(groupId); 21 | if (num == null || num == 0) { 22 | return groupName; 23 | } else { 24 | return groupName + " " + num + "未读"; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/InviteGroupSelfResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.support.Command; 4 | import com.easychat.fx.support.Packet; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/19. 12 | * description: 服务端发送给被邀请方的响应 13 | */ 14 | @Data 15 | public class InviteGroupSelfResp extends Packet { 16 | /** 发出邀请成功用户*/ 17 | private List successUser; 18 | private List failedUser; 19 | /** 群名*/ 20 | private String groupName; 21 | /** 群Id*/ 22 | private String groupId; 23 | 24 | @Override 25 | public byte getCommand() { 26 | return Command.INVITE_GROUP_SELF_RESP; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/client/handle/IMIdleStateHandler.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.client.handle; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.timeout.IdleStateEvent; 5 | import io.netty.handler.timeout.IdleStateHandler; 6 | 7 | import java.util.concurrent.TimeUnit; 8 | 9 | public class IMIdleStateHandler extends IdleStateHandler { 10 | 11 | private static final int READER_IDLE_TIME = 15; 12 | 13 | public IMIdleStateHandler() { 14 | super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS); 15 | } 16 | 17 | @Override 18 | protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) { 19 | System.out.println(READER_IDLE_TIME + "秒内未读到数据,关闭连接"); 20 | ctx.channel().close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/bean/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.bean; 2 | 3 | import lombok.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * @author Zed 10 | * date: 2019/08/22. 11 | * description: 分页返回model 12 | */ 13 | @Data 14 | @Builder 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class PageResult implements Serializable { 18 | 19 | /** 20 | * 21 | */ 22 | private static final long serialVersionUID = 1L; 23 | /** 24 | * 总记录数 25 | */ 26 | private int totalRecord; 27 | /** 28 | * 记录 29 | */ 30 | private List records; 31 | /** 32 | * 是否有下一页 33 | */ 34 | private boolean hasNext; 35 | 36 | /** 37 | * 总页数 38 | */ 39 | private int pages; 40 | 41 | private int currentPage; 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/client/handle/HeartBeatRespHandler.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.client.handle; 2 | 3 | import com.easychat.fx.support.response.HertBeatResp; 4 | import io.netty.channel.ChannelHandler; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | 8 | /** 9 | * @author Zed 10 | * date: 2019/08/20. 11 | * description: 12 | */ 13 | @ChannelHandler.Sharable 14 | public class HeartBeatRespHandler extends SimpleChannelInboundHandler { 15 | private HeartBeatRespHandler() {} 16 | public static HeartBeatRespHandler INSTANCE = new HeartBeatRespHandler(); 17 | @Override 18 | protected void channelRead0(ChannelHandlerContext ctx, HertBeatResp msg) throws Exception { 19 | //System.out.println("收到心跳返回消息, 消息指令为" + msg.getCommand()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/MessageResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.util.AES; 4 | import com.easychat.fx.util.DateUtils; 5 | import com.easychat.fx.support.Command; 6 | import com.easychat.fx.support.Packet; 7 | import lombok.Data; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/19. 12 | * description: 13 | */ 14 | @Data 15 | public class MessageResp extends Packet { 16 | private String sender; 17 | private String senderName; 18 | private String message; 19 | /** 20 | * 消息类型 21 | */ 22 | private int messageType = 0; 23 | @Override 24 | public byte getCommand() { 25 | return Command.SEND_MESSAGE_RESP; 26 | } 27 | @Override 28 | public String toString(){ 29 | return senderName + " " + DateUtils.convertShowTime(dateTime) + ": \n " + AES.decrypt(message, dateTime+"ab"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/client/handle/AddUserRespHandler.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.client.handle; 2 | 3 | import com.easychat.fx.support.response.AddUserResp; 4 | import com.easychat.fx.util.ShowUtil; 5 | import io.netty.channel.ChannelHandler; 6 | import io.netty.channel.ChannelHandlerContext; 7 | import io.netty.channel.SimpleChannelInboundHandler; 8 | 9 | /** 10 | * @author Zed 11 | * date: 2019/08/20. 12 | * description: 13 | */ 14 | @ChannelHandler.Sharable 15 | public class AddUserRespHandler extends SimpleChannelInboundHandler { 16 | private AddUserRespHandler() {} 17 | public static AddUserRespHandler INSTANCE = new AddUserRespHandler(); 18 | @Override 19 | protected void channelRead0(ChannelHandlerContext ctx, AddUserResp msg) throws Exception { 20 | ShowUtil.addSystemMessage(msg); 21 | System.out.println("id: " + msg.getInviterId() + " 用户添加你为好友, 请及时处理!"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/code/Spliter.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.code; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 6 | 7 | /** 8 | * @author Zed 9 | * date: 2019/08/19. 10 | * description: 11 | */ 12 | public class Spliter extends LengthFieldBasedFrameDecoder { 13 | private static final int LENGTH_FIELD_OFFSET = 7; 14 | private static final int LENGTH_FIELD_LENGTH = 4; 15 | public Spliter() { 16 | super(Integer.MAX_VALUE, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH); 17 | } 18 | 19 | @Override 20 | protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { 21 | if (in.getInt(in.readerIndex()) != PacketCode.MAGIC_NUMBER) { 22 | ctx.channel().close(); 23 | return null; 24 | } 25 | return super.decode(ctx, in); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/easychat/fx/support/response/AddUserResp.java: -------------------------------------------------------------------------------- 1 | package com.easychat.fx.support.response; 2 | 3 | import com.easychat.fx.bean.User; 4 | import com.easychat.fx.util.DateUtils; 5 | import com.easychat.fx.service.UserService; 6 | import com.easychat.fx.support.Command; 7 | import com.easychat.fx.support.Packet; 8 | import lombok.Data; 9 | 10 | /** 11 | * @author Zed 12 | * date: 2019/08/19. 13 | * description: 14 | */ 15 | @Data 16 | public class AddUserResp extends Packet { 17 | /** 邀请方id*/ 18 | private String inviterId; 19 | @Override 20 | public byte getCommand() { 21 | return Command.ADD_USER_RESP; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | User user = UserService.getInstance().getUserById(inviterId); 27 | String name = user == null ? inviterId : user.getUserName(); 28 | return DateUtils.convertShowTime(dateTime) + ":" + name + "向你发送了一条好友申请"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/addUser.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |