- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用 Java 编写客户端/服务器应用程序,它通过使用 ObjectStream 类通过套接字发送对象进行通信。应用程序中的每个节点大致如下所示:
class Node {
SocketServer server;
Socket[] clients;
}
这里的server
变量是本节点监听的socket,client
变量是其他节点监听的socket,本节点向其发送对象.
我用来将对象写入其中一个客户端套接字的代码如下所示:
void sendMessage(Message<B, F> msg) throws IOException {
ObjectOutputStream writer = getWriter();
writer.writeObject(msg);
writer.flush();
}
private ObjectOutputStream writer;
ObjectOutputStream getWriter() throws IOException {
if (writer == null)
writer = new ObjectOutputStream(
new BufferedOutputStream(client.getOutputStream()));
return writer;
}
我用来处理连接和从节点的服务器套接字读取对象的代码如下所示:
// the handler will listen for connections
final Thread handler = new Thread(new Runnable() {
public void run() {
try {
// create a new thread to handle the client
final Socket client = server.accept();
final Thread thread = new Thread(new Runnable() {
public void run() {
final ObjectInputStream reader;
try {
reader = new ObjectInputStream(client.getInputStream());
while (true) {
try {
val msg = reader.readObject();
messages.add((Message<B, F>) msg);
}
catch (EOFException e) {
// i noted it seemed to throw eofexceptions
}
catch (IOException e) {
// do something
}
}
}
catch (IOException e) {
// do something
}
}
});
thread.start();
} catch (IOException e) {
// do something
}
}
});
handler.start();
我想我这里的套接字有问题。当每台服务器只连接到一个客户端时,一切正常。但是,当多个客户端与同一台服务器通信时,事情就变糟了,我从 ObjectInputStream 中得到 StreamCorruptedException 和其他奇怪的行为(放入 UpdateRequest 消息的实例,并取出 Integer(0) 的实例和一些异常,例如。)
我的直觉告诉我,两个对象/字节流以某种方式混合在一起,这会在尝试反序列化对象时产生奇怪的结果。我的问题是:为什么会发生这种情况,也就是我做错了什么,我该如何解决?
最佳答案
您有一组套接字,但似乎没有一组写入器和读取器。因此,您可能对所有连接使用相同的写入器和读取器。
实际上,您应该有一个每个连接的 Connection 对象,它实现了 Runnable,并且具有 Socket、编写器和读取器作为实例成员。
此外,当您捕获 EOFException 时,您必须跳出循环并关闭编写器。
关于具有多个客户端的 Java SocketServer - StreamCorruptException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6473183/
应用 我正在用 Java 编写客户端/服务器应用程序,它通过使用 ObjectStream 类通过套接字发送对象进行通信。应用程序中的每个节点大致如下所示: class Node { Socket
我正在尝试将对象从客户端(普通 IO)传输到服务器(NIO)。传输工作正常,直到对象达到一定大小,然后服务器将抛出“StreamCorruptException”,指出“类型代码无效”。 在服务器上调
我是一名优秀的程序员,十分优秀!