如何处理套接字异常以在Java中形成连续的程序流



我正在使用JavaFX和套接字编程在Java中创建一个skribl克隆。

我使用objectinput/outputstream通过TCP连接发送数据。

应用程序每运行2/5次就没有任何异常,但其他时候它会显示大量与套接字相关的异常,我不知道为什么会发生这种情况。

java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:271)
at java.base/java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2854)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:3181)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3191)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1621)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:488)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:446)
at com.nttd.wtdoodle.Client.Game.Server.PlayerHandler$1.run(PlayerHandler.java:54)
at java.base/java.lang.Thread.run(Thread.java:829)
Error sending Message to clien
java.io.StreamCorruptedException: invalid type code: 00
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1701)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2479)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2373)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2211)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1670)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:488)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:446)
at com.nttd.wtdoodle.Client.Game.Player.PtoSBridge$1.run(PtoSBridge.java:55)
at java.base/java.lang.Thread.run(Thread.java:829)
Error sending Message to client

还有一个例外,那就是ClassCastException。我不知道为什么这些例外情况有时会发生,但并非总是发生。

我想知道objectoutput/inputstream是否适合这项工作。

你能建议其他有用的流吗?

感谢您的回复和回答。我已经将ObjectStream更改为BufferedReader和BufferedWriter,它解决了我的问题。

无论编程网络代码,我们都必须牢记一件事:迟早会发生错误:专用数据传输、断开连接、重复等。即使使用TCP(一种具有一些重要保证的传输层协议(,您的应用层也必须假设最终会发生各种各样的网络问题。

虽然您没有显示代码,但我们可以通过stacktrace推断您正在交换结构化数据,可能是以编码java对象形式的大型结构化数据。这种策略的问题是:

  • 如果对象总是相同的形状,那么总是发送/读取相同的元数据会产生相当大的开销,这是可以避免的。数据越大,就越容易出现网络错误。考虑只对所需的数据进行编码,以避免连续发送相同的元数据
  • 如果您的对象的序列化版本中哪怕只有一小部分丢失或阻塞,则接收的无法恢复该对象。这比接收器试图恢复数据不完整或不一致的对象的情况要好。因此,java会抛出异常来为您新浪化它。一旦出现异常,您必须编写代码:要求远程码头重新发送数据、重新连接套接字等

如果没有看到代码,我们无法准确地说出您的代码发生了什么。但据我所见,解决方案是正确地实施";不幸的道路";在捕获块内

最新更新