JavaStudy11(22章-多用户即时通信系统)—B站hsp
1.22章-多用户即时通信系统
1.1 QQ 聊天项目演示
1.1.1 项目 QQ 演示
1.2 为什么选择这个项目
1.2.1 项目开发流程
1.2.2 需求分析
1.2.3 界面设计
1.2.4 功能实现-用户登录
1.2.5 功能实现-拉取在线用户列表
1.2.6 功能实现-无异常退出
1.2.7 功能实现-私聊
1.2.8 功能实现-群聊
1.2.9 功能说明-发文件
1.2.10 功能实现-服务器推送新闻
1.2 Client
import com.qinbo.qqclient.Service.FileClientService;
import com.qinbo.qqclient.Service.MessageClientService;
import com.qinbo.qqclient.Service.UserClientService;
import com.qinbo.utils.Utility;
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) {
QQView qqView = new QQView();
qqView.mainMenu();
System.out.println("客户端退出系统");
}
private void mainMenu() {
while (loop) {
System.out.println("============欢迎登录网络通信系统==========");
System.out.println("\t\t 1 登录系统");
System.out.println("\t\t 2 退出系统");
System.out.print("请输入你的选择:");
key = Utility.readString(1);
switch (key) {
case "1":
System.out.print("请输入你的账号:");
String userId = Utility.readString(50);
System.out.print("请输入你的密码:");
String paaWord = Utility.readString(50);
if (userClientService.checkUser(userId, paaWord)) {
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.print("请输入你的选择:");
key = Utility.readString(1);
switch (key) {
case "1":
userClientService.onlineFriendList();
break;
case "2":
System.out.print("请输入要群发的消息:");
String toAllContent = Utility.readString(100);
messageClientService.sendMessageToAll(toAllContent, userId);
break;
case "3":
System.out.println("请输入想聊天的用户号(在线):");
String getterId = Utility.readString(50);
System.out.println("请输入想说的话:");
String content = Utility.readString(100);
messageClientService.sendMessageToOne(content, userId, getterId);
break;
case "4":
System.out.print("请输入你想把文件发送给的用户(在线):");
getterId = Utility.readString(50);
System.out.print("请输入发送文件的完整路径(形式:d:\\xx.jpg):");
String src = Utility.readString(100);
System.out.print("请输入把文件发送到对方的路径(形式:d:\\xx.jpg):");
String dest = Utility.readString(100);
fileClientService.sendFileToOne(src,dest,userId,getterId);
break;
case "9":
userClientService.logout();
loop = false;
break;
default:
System.out.println("输入有误");
}
}
} else {
System.out.println("=========登陆失败=========");
break;
}
break;
case "9":
userClientService.logout();
loop = false;
break;
default:
System.out.println("输入有误");
}
}
}
}
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import java.io.*;
import java.net.Socket;
public class ClientConnectServerThread extends Thread {
private Socket socket;
public ClientConnectServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
System.out.println("客户端线程等待读取从服务器端发送的信息..");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message message = (Message) ois.readObject();
if (message.getMesType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {
String[] onlineUsers = message.getContent().split(" ");
System.out.println("\n========当前在线用户列表========");
for (int i = 0; i < onlineUsers.length; i++) {
System.out.println("用户:" + onlineUsers[i]);
}
} else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {
System.out.println("\n========你收到一条消息来自" + message.getSender() + "的消息=====");
System.out.println("\n" + message.getSndTime() + "\n" +
message.getSender() + " 对 " +
message.getGetter() + "说:" + message.getContent());
} else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
System.out.println("\n" + message.getSender() + "对大家说:" + message.getContent());
} else if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)) {
System.out.println("\n" + message.getSender() + " 给 " + message.getGetter() +
"发文件:" + message.getSrc() + " 到我的目录: " + message.getDest());
FileOutputStream fileOutputStream = new FileOutputStream(message.getDest(),true);
fileOutputStream.write(message.getFileBytes());
fileOutputStream.close();
System.out.println("\n 文件保存成功~");
} else {
System.out.println("其他类型,暂不处理");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import java.io.*;
public class FileClientService {
public void sendFileToOne(String src, String dest, String senderId, String getter){
Message message = new Message();
message.setMesType(MessageType.MESSAGE_FILE_MES);
message.setSender(senderId);
message.setGetter(getter);
message.setSrc(src);
message.setDest(dest);
FileInputStream fileInputStream = null;
byte[] fileBytes = new byte[(int)new File(src).length()];
try {
fileInputStream= new FileInputStream(src);
fileInputStream.read(fileBytes);
message.setFileBytes(fileBytes);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("\n" + senderId + " 给" + getter + "发送文件:" + src
+ "到对方的电脑目录" + dest);
try {
ObjectOutputStream oos = new ObjectOutputStream(
ManageClientConnectServerThread.getClientConnectServerThread(
senderId).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.qinbo.qqclient.Service;
import java.util.HashMap;
public class ManageClientConnectServerThread {
private static HashMap<String,ClientConnectServerThread> hm = new HashMap<>();
public static void addClientConnectServerThread(String userId, ClientConnectServerThread clientConnectServerThread){
hm.put(userId,clientConnectServerThread);
}
public static ClientConnectServerThread getClientConnectServerThread(String userId){
return hm.get(userId);
}
}
package com.qinbo.qqclient.Service;
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MessageClientService {
public void sendMessageToAll(String content, String senderId){
Message message = new Message();
message.setMesType(MessageType.MESSAGE_TO_ALL_MES);
message.setSender(senderId);
message.setContent(content);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
message.setSndTime(sdf.format(new Date()).toString());
System.out.println("用户 " + senderId + " 对大家说:" + content);
try {
ObjectOutputStream oos = new ObjectOutputStream(
ManageClientConnectServerThread.getClientConnectServerThread(
senderId).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessageToOne(String content, String senderId, String getterId){
Message message = new Message();
message.setMesType(MessageType.MESSAGE_COMM_MES);
message.setSender(senderId);
message.setGetter(getterId);
message.setContent(content);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
message.setSndTime(sdf.format(new Date()).toString());
System.out.println("用户 " + senderId + " 说 " + content);
try {
ObjectOutputStream oos = new ObjectOutputStream(
ManageClientConnectServerThread.getClientConnectServerThread(
senderId).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.qinbo.qqclient.Service;
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import com.qinbo.qqcommon.User;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class UserClientService {
private User u = new User();
private Socket socket;
public boolean checkUser(String userId, String pwd) {
boolean b = false;
u.setUserId(userId);
u.setPassword(pwd);
try {
socket = new Socket(InetAddress.getByName("192.168.10.9"), 9999);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(u);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message ms = (Message) ois.readObject();
if (ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
ClientConnectServerThread clientConnectServerThread =
new ClientConnectServerThread(socket);
clientConnectServerThread.start();
ManageClientConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
b = true;
} else {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return b;
}
public void onlineFriendList(){
Message message = new Message();
message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
message.setSender(u.getUserId());
try {
ClientConnectServerThread clientConnectServerThread =
ManageClientConnectServerThread.getClientConnectServerThread(u.getUserId());
Socket socket = clientConnectServerThread.getSocket();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
public void logout(){
Message message = new Message();
message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
message.setSender(u.getUserId());
try {
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
System.out.println(u.getUserId() + "退出系统");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.qinbo.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 sndTime;
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 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 getSndTime() {
return sndTime;
}
public void setSndTime(String sndTime) {
this.sndTime = sndTime;
}
public String getMesType() {
return mesType;
}
public void setMesType(String mesType) {
this.mesType = mesType;
}
}
package com.qinbo.qqcommon;
public interface MessageType {
String MESSAGE_LOGIN_SUCCEED = "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";
}
package com.qinbo.qqcommon;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String userId;
private String password;
public User(String userId, String password) {
this.userId = userId;
this.password = password;
}
public User() {
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.qinbo.utils;
import java.util.*;
public class Utility {
private static Scanner scanner = new Scanner(System.in);
public static char readMenuSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static char readChar() {
String str = readKeyBoard(1, false);
return str.charAt(0);
}
public static char readChar(char defaultValue) {
String str = readKeyBoard(1, true);
return (str.length() == 0) ? defaultValue : str.charAt(0);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static int readInt(int defaultValue) {
int n;
for (; ; ) {
String str = readKeyBoard(10, true);
if (str.equals("")) {
return defaultValue;
}
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
public static char readConfirmSelection() {
System.out.println("请输入你的选择(Y/N)");
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
}
1.3 Server
package com.qinbo.qqframe;
import com.qinbo.qqserver.service.QQServer;
public class QQFrame {
public static void main(String[] args) {
new QQServer();
}
}
package com.qinbo.qqserver.service;
import sun.plugin2.message.GetAuthenticationMessage;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class ManageServerThreads {
private static HashMap<String, ServerConnectClientThread> hm = new HashMap<>();
public static HashMap<String, ServerConnectClientThread> getHm() {
return hm;
}
public static void addServerConnectClientThread(String userId, ServerConnectClientThread serverConnectClientThread) {
hm.put(userId, serverConnectClientThread);
}
public static void removeServerConnectClientThread(String userId) {
hm.remove(userId);
}
public static ServerConnectClientThread getServerConnectClientThread(String userId) {
return hm.get(userId);
}
public static String getOnlineUser() {
Iterator<String> iterator = hm.keySet().iterator();
String onlineUseList = "";
while (iterator.hasNext()) {
onlineUseList += iterator.next().toString() + " ";
}
return onlineUseList;
}
}
package com.qinbo.qqserver.service;
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import com.qinbo.qqcommon.User;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public class QQServer {
private ServerSocket serverSocket = null;
private static ConcurrentHashMap<String, User> validUser = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, ArrayList<Message>> offLineDb = new ConcurrentHashMap<>();
static {
validUser.put("100", new User("100", "123456"));
validUser.put("200", new User("200", "123456"));
validUser.put("300", new User("300", "123456"));
validUser.put("至尊宝", new User("至尊宝", "123456"));
validUser.put("紫霞仙子", new User("紫霞仙子", "123456"));
validUser.put("菩提老祖", new User("菩提老祖", "123456"));
}
private boolean checkUser(String userId, String passWd) {
User user = validUser.get(userId);
if (user == null) {
return false;
}
if (!user.getPassword().equals(passWd)) {
return false;
}
return true;
}
public QQServer() {
try {
System.out.println("服务器在9999端口监听..");
new Thread(new SendNewsToAllService()).start();
serverSocket = new ServerSocket(9999);
while (true) {
Socket socket = serverSocket.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
User u = (User) ois.readObject();
Message message = new Message();
if (checkUser(u.getUserId(), u.getPassword())) {
message.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);
oos.writeObject(message);
ServerConnectClientThread serverConnectClientThread =
new ServerConnectClientThread(socket, u.getUserId());
serverConnectClientThread.start();
ManageServerThreads.addServerConnectClientThread(u.getUserId(), serverConnectClientThread);
} else {
System.out.println("登录失败," + u.getUserId() + "id和pwd不匹配");
message.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
oos.writeObject(message);
socket.close();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.qinbo.qqserver.service;
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import com.qinbo.utils.Utility;
import com.sun.deploy.util.SyncAccess;
import javax.swing.plaf.synth.SynthScrollBarUI;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.*;
public class SendNewsToAllService implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("请输入服务器要推送的消息/新闻(输入[exit]退出推送服务线程)");
String news = Utility.readString(1000);
if ("exit".equals(news)){
break;
}
Message message = new Message();
message.setSender("服务器");
message.setMesType(MessageType.MESSAGE_TO_ALL_MES);
message.setContent(news);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
message.setSndTime(sdf.format(new Date()).toString());
System.out.println("服务器推送消息对所有人说:" + news);
HashMap<String, ServerConnectClientThread> hm = ManageServerThreads.getHm();
Iterator iterator = hm.keySet().iterator();
while (iterator.hasNext()) {
String onlineUserId = iterator.next().toString();
ServerConnectClientThread serverConnectClientThread = hm.get(onlineUserId);
try {
ObjectOutputStream oos = new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.qinbo.qqserver.service;
import com.qinbo.qqcommon.Message;
import com.qinbo.qqcommon.MessageType;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class ServerConnectClientThread extends Thread {
private Socket socket;
private String userId;
public ServerConnectClientThread(Socket socket, String userId) {
this.socket = socket;
this.userId = userId;
}
@Override
public void run() {
while (true) {
try {
System.out.println("服务端和客户端" + userId + "保持通信,读取数据..");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message message = (Message) ois.readObject();
if (message.getMesType().equals(MessageType.MESSAGE_GET_ONLINE_FRIEND)) {
System.out.println(message.getSender() + "要在线列表");
String onlineUser = ManageServerThreads.getOnlineUser();
Message message2 = new Message();
message2.setMesType(MessageType.MESSAGE_RET_ONLINE_FRIEND);
message2.setContent(onlineUser);
message2.setGetter(message.getSender());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message2);
} else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {
ServerConnectClientThread serverConnectClientThread =
ManageServerThreads.getServerConnectClientThread(message.getGetter());
ObjectOutputStream oos = new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
oos.writeObject(message);
} else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
HashMap<String, ServerConnectClientThread> hm = ManageServerThreads.getHm();
Set<String> keySet = hm.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String onLineUserId = iterator.next().toString();
if (!onLineUserId.equals(message.getSender())) {
ObjectOutputStream oos = new ObjectOutputStream(
hm.get(onLineUserId).getSocket().getOutputStream());
oos.writeObject(message);
}
}
} else if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)) {
ObjectOutputStream oos = new ObjectOutputStream(
ManageServerThreads.getServerConnectClientThread(message.getGetter()).getSocket().getOutputStream());
oos.writeObject(message);
} else if (message.getMesType().equals(MessageType.MESSAGE_CLIENT_EXIT)) {
System.out.println(message.getSender() + "退出客户端");
ManageServerThreads.removeServerConnectClientThread(message.getSender());
socket.close();
break;
} else {
System.out.println("其他类型MessageType,暂不处理");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
}
package com.qinbo.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 sndTime;
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 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 getSndTime() {
return sndTime;
}
public void setSndTime(String sndTime) {
this.sndTime = sndTime;
}
public String getMesType() {
return mesType;
}
public void setMesType(String mesType) {
this.mesType = mesType;
}
}
package com.qinbo.qqcommon;
public interface MessageType {
String MESSAGE_LOGIN_SUCCEED = "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";
}
package com.qinbo.qqcommon;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String userId;
private String password;
public User(String userId, String password) {
this.userId = userId;
this.password = password;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.qinbo.utils;
import java.util.Scanner;
public class Utility {
private static Scanner scanner = new Scanner(System.in);
public static char readMenuSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static char readChar() {
String str = readKeyBoard(1, false);
return str.charAt(0);
}
public static char readChar(char defaultValue) {
String str = readKeyBoard(1, true);
return (str.length() == 0) ? defaultValue : str.charAt(0);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static int readInt(int defaultValue) {
int n;
for (; ; ) {
String str = readKeyBoard(10, true);
if (str.equals("")) {
return defaultValue;
}
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
public static char readConfirmSelection() {
System.out.println("请输入你的选择(Y/N)");
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
}
e : str;
}
public static char readConfirmSelection() {
System.out.println("请输入你的选择(Y/N)");
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/004d55c510774837bc59eb5b0d2b74c9.png)