我正在写一个类似QQ通信系统的程序,但是遇到这样一个问题:
qq中不能同时登陆一个账号,如果这个账号被1端登陆上,但2端也想登陆上,这时候1端被强制退出,于是2端成功登陆上,就避免了两个账号同时登陆的问题
但是我在写程序的时候,发现2端在登陆后,1端确实被强制退出了,2端和服务端抛出了异常:SokectException :Connect Reset
我不清楚这是为什么,代码里 if (newUser != null)代码块是我主题
以下是我的代码
public QQServer() throws IOException {
try {
while (true) {
//得到一个客户端输入的Socket
Socket socket = sockets.accept();
//得到一个对象流
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
User user = (User) objectInputStream.readObject();
//这里是注册操作
//检查是否是要操作注册的用户:看看这个用户的id是否为空,如果为0,则是
if (user.getId() == 0) {
//得到对应的Socket
System.out.println("用户请求注册账户");
RegisterAccount(user, socket);
continue;
}
//下面是登陆操作
//验证账号密码
int id = user.getId();
String password = user.getPassword();
Message message = new Message();
//连接数据库,得到一个User类对象
User newUser = CheckLogin(id, password);
message.setUser(newUser);
//如果这个对象存在
if (newUser != null) {
//下面是验证这个用户是否在线,如果在线,那么在线的那一端就被强制下线,这一点就是新登录的线程
if(CheckOnline(user)!=null){
QQClientConnectServerThread qqClientConnectServerThread = ManageConnectThread.getHashMapSocket(user.getId());
Message message1 = new Message();
message1.setMessageType(MessageType.MESSAGE_EXIT);
//得到一直在登录的Socket
Socket socket1 = qqClientConnectServerThread.getSocket();
//从hashmap中删除这个线程
ManageConnectThread.RemoveHashMapSocket(user.getId());
//发送
new ObjectOutputStream(socket1.getOutputStream()).writeObject(message1);
//关闭这个Socket
//socket1.close();
}
//新的一端成功登陆上
message.setMessageType(MessageType.MESSAGE_LOGIN_SUCCESS);
//创建一个线程类
QQClientConnectServerThread qqClientConnectServerThread = new QQClientConnectServerThread(id, socket);
//将该线程放到hashmap
ManageConnectThread.addHashMapSocket(id, qqClientConnectServerThread);
//将该登陆的账号和姓名插入到OnlineUser里面去
String sql = "insert into onlineUser values(?,?)";
userDao.QueryDML(sql, newUser.getId(), newUser.getName());
//启动该线程
new Thread(qqClientConnectServerThread).start();
//新建一个对象输出流,将message发送过去
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(message);
System.out.println(user.getId() + "已登录系统");
} else {
message.setMessageType(MessageType.MESSAGE_LOGIN_FAIL);
//新建一个对象输出流,将message发送过去
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(message);
socket.close();
}
}
} catch (IOException | SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
sockets.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}