【发布时间】:2016-11-16 00:44:04
【问题描述】:
我刚才遇到了一个奇怪的错误。我在玩 Serializable 对象,我正在使用两个对象,通过 Socket 连接相互通信。这两个应用程序相同(Peer 2 peer),但有两个实例正在运行并尝试通信。
问题似乎围绕着从套接字InputStream 获取ObjectInputStream。我的错误发生在reader = new ObjectInputSream(cliIn),我被抛出了一个 SocketTimeoutException(这本身很奇怪,我希望在装饰我的流时不会在read()。下面是我尝试做的事情。
Socket clientSocket;
clientSocket = new Socket(InetAddress.getByName(aHostIP), aPort);
clientSocket.setSoTimeout(3000);
InputStream cliIn = clientSocket.getInputStream();
ObjectInputStream reader = null;
reader = new ObjectInputStream(cliIn); // <--- Error here
ObjectOutputStream writer;
writer = new ObjectOutputStream(new BufferedOutputStream(
clientSocket.getOutputStream()
));
writer.writeObject(new Request(aPort));
writer.flush();
奇怪的是,如果我将 ObjectInputStream 的创建移动到我写到 OutputStream 之后(此时另一个对象会响应请求),那么就不会再出现错误了。
Socket clientSocket;
clientSocket = new Socket(InetAddress.getByName(aHostIP), aPort);
clientSocket.setSoTimeout(3000);
ObjectOutputStream writer;
writer = new ObjectOutputStream(new BufferedOutputStream(
clientSocket.getOutputStream()
));
writer.writeObject(new Request(aPort));
writer.flush();
InputStream cliIn = clientSocket.getInputStream();
ObjectInputStream reader = null;
reader = new ObjectInputStream(cliIn); // <--- No more error
另一方(响应方)如下所示:
ObjectInputStream in = new ObjectInputStream(aConnection.getInputStream());
Object req = in.readObject();
SysIO.print("FROM OBJECT! : " + req.toString());
SysIO.print("FROM OBJECT! Port: " + ((Request) req).getPort());
Request res = new Request(15);
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(aConnection.getOutputStream()));
out.writeObject(res);
out.flush();
它现在可以工作,但我很想知道问题出在哪里,以供将来参考。我可以看到可能很难准确地说出来,但也许你有一些进一步调查的指针,并发问题,我使用 Sockets 或 Buffers 是否错误?
(我省略了一些错误处理以使其更清晰。)
【问题讨论】:
标签: java multithreading sockets