我有一个简单的服务器-客户端套接字连接。我将所有数据封装在对象中,这些对象通过ObjectStreams发送到套接字之间进行传递。
我创建了一个“心跳”监视器,在一个单独的线程中运行,其中服务器和客户端每500毫秒发送一个心跳(空对象)来检查连通性,这很好。但是,由于这个原因,当我想在服务器和客户端之间发送其他数据时,它会与这些心跳对象混淆。
例如,我的服务器正在等待一个登录对象,但实际上收到的是一个HeartBeat实例对象。
我的代码是一个简单的客户端/服务器设置,因此我不认为需要发布它们的代码,但是,HeartBeat代码如下:
我的选择似乎只有以下几种:
我创建了一个“心跳”监视器,在一个单独的线程中运行,其中服务器和客户端每500毫秒发送一个心跳(空对象)来检查连通性,这很好。但是,由于这个原因,当我想在服务器和客户端之间发送其他数据时,它会与这些心跳对象混淆。
例如,我的服务器正在等待一个登录对象,但实际上收到的是一个HeartBeat实例对象。
我的代码是一个简单的客户端/服务器设置,因此我不认为需要发布它们的代码,但是,HeartBeat代码如下:
private static final int HEARTBEAT_INTERVAL = 500;
private void addHeartBeatMonitor(final Socket socket) {
this.heartBeatTimer = new Timer();
this.heartBeatTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.writeObject(new HeartBeat());
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
if (!(is.readObject() instanceof HeartBeat)) { throw new IOException(); }
} catch (IOException e) {
LOG.info("Received disconnect from " + getClientSocket().getInetAddress());
heartBeatTimer.cancel();
if (clientSocket != null) {
try {
clientSocket.close();
} catch (IOException e1) {}
}
} catch (ClassNotFoundException e) {}
}
}, 0, HEARTBEAT_INTERVAL);
}
我的选择似乎只有以下几种:
- 放弃 HeartBeat 功能,尽管没有其他可靠的方法来检查连接状态。
- 找到其他一些奇妙的套接字实现,可以为我解决所有问题。
- 编写同步方法,监视对套接字的所有读写操作,丢弃 HeartBeats 并将其他对象发送到它们应该在的位置。
- 某种同步魔法。
非常感谢您提供的帮助!
编辑: 读取 Login 对象的代码(服务器端):
User result = null;
try {
ObjectInputStream is = new ObjectInputStream(this.getInputStream());
Login request = (Login) is.readObject(); ### ERROR ###
result = this.mongoService.login(request);
ObjectOutputStream os = new ObjectOutputStream(this.getOutputStream());
os.writeObject(result);
} catch (IOException e) {
} catch (ClassNotFoundException e) {}
return result;
以下是异常信息:
Exception in thread "Thread-0" java.lang.ClassCastException: model.HeartBeat cannot be cast to model.Login
at socket.SocketServerWorker.login(SocketServerWorker.java:78)
at socket.SocketServerWorker.<init>(SocketServerWorker.java:47)
at socket.SocketServer$2.run(SocketServer.java:50)
at java.lang.Thread.run(Thread.java:744)