项目结构
客户端:
服务端:
客户端(QQClient)
qqcommon 包下
User类:
package com.hspedu.qqcommon;
import java.io.Serializable;
// 表示一个用户/客户信息
public class User implements Serializable {
private static final long serialVersionUID=1L; //序列化
private String userId; // 用户id/用户名
private String passwd; // 用户密码
public User() {
}
public User(String userId, String passwd) {
this.userId = userId;
this.passwd = passwd;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
Message类:
package com.hspedu.qqcommon;
import java.io.Serializable;
/*
表示客户端和服务端通信时的消息对象
*/
public class Message implements Serializable {
private static final long serialVersionUID=1L;
private String sender; // 发送者
private String getter; // 接收者
private String content; // 消息内容
private String sendTime; // 发送时间
private String mesType; // 消息类型
//进行扩展 和文件相关的成员
private byte[] fileBytes;
private int fileLen=0; //大小长度
private String dest;// 将文件传输到哪里
private String src;// 源文件路径
public byte[] getFileBytes() {
return fileBytes;
}
public void setFileBytes(byte[] fileBytes) {
this.fileBytes = fileBytes;
}
public int getFileLen() {
return fileLen;
}
public void setFileLen(int fileLen) {
this.fileLen = fileLen;
}
public String getDest() {
return dest;
}
public void setDest(String dest) {
this.dest = dest;
}
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getMesType() {
return mesType;
}
public void setMesType(String mesType) {
this.mesType = mesType;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getGetter() {
return getter;
}
public void setGetter(String getter) {
this.getter = getter;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSendTime(String s) {
return sendTime;
}
public void setSendTime(String sendTime) {
this.sendTime = sendTime;
}
}
MessageType接口:
package com.hspedu.qqcommon;
/*
表示消息类型
*/
public interface MessageType {
//1.在接口中定义了一些常量
//2.不同的常量的值,表示不同的消息类型
String MESSAGE_LOGIN_SUCCESS="1"; // 表示登录成功
String MESSAGE_LOGIN_FAIL="2"; // 表示登录失败
String MESSAGE_COMM_MES = "3"; // 普通信息包
String MESSAGE_GET_ONLINE_FRIEND="4";// 要求返回在线用户列表
String MESSAGE_RET_ONLINE_FRIEND="5";// 返回在线用户列表
String MESSAGE_CLIENT_EXIT="6";// 客户端请求退出
String MESSAGE_TO_ALL_MES = "7"; // 群发消息包
String MESSAGE_FILE_MES="8";// 文件消息(发送文件)
}
view包下
菜单入口:
package com.hspedu.qqclient.view;
import com.hspedu.qqclient.service.FileClientService;
import com.hspedu.qqclient.service.MessageClientService;
import com.hspedu.qqclient.service.UserClientService;
import com.hspedu.qqclient.utilitys.Utility;
import org.junit.jupiter.api.Test;
/*
客户端的菜单界面
*/
public class QQView {
private boolean loop = true;// 控制是否显示菜单那
private String key = ""; // 接收用户的键盘输入
private UserClientService userClientService = new UserClientService();// 对象是用于登录/注册用户
private MessageClientService messageClientService = new MessageClientService();//对象用户私聊/群聊
private FileClientService fileClientService=new FileClientService();// 该用户对象用于传输文件
public static void main(String[] args) {
new QQView().mainMenu();
System.out.println("退出客户端。。。");
}
//显示主菜单
public void mainMenu() {
while (loop) {
System.out.println("==========欢迎登录网络通信系统===========");
System.out.println("\t\t 1 登录系统");
System.out.println("\t\t 9 退出系统");
System.out.println("请输入你的选择:");
key = Utility.readString(1);
//根据用户的输入,来处理不同的逻辑
switch (key) {
case "1":
System.out.print("请输入用户名:");
String userId = Utility.readString(50);
System.out.print("请输入密 码:");
String passwd = Utility.readString(50);
// 到服务器验证该用户是否合法
if (userClientService.checkUser(userId, passwd)) {
System.out.println("==========欢迎(用户 " + userId + ") 登录成功 ===========");
//进入二级菜单
while (loop) {
System.out.println("\n==========网络通信系统二级菜单(用户" + userId + " )===========");
System.out.println("\t\t 1 显示在线用户列表");
System.out.println("\t\t 2 群发消息");
System.out.println("\t\t 3 私聊消息");
System.out.println("\t\t 4 发送文件");
System.out.println("\t\t 9 退出系统");
System.out.println("请输入你的选择:");
key = Utility.readString(1);
switch (key) {
case "1":
userClientService.onlineFriendList();
break;
case "2":
System.out.println("请输入相对大家说的话:");
String s = Utility.readString(50);
//调用一个方法,把消息封装成message对象,发送给服务端
messageClientService.sendMessageToAll(s,userId);
break;
case "3":
System.out.println("请输入想聊天的用户号(在线): ");
String getterId = Utility.readString(50);
System.out.println("请输入想说的话: ");
String content = Utility.readString(50);