Kann nicht ObjectInputStream zu arbeiten
Ich bin gerade versucht mein server zu erstellen, der eine Verbindung mit einem client. Ich habe ein thread erstellt für jede Verbindung, aber der server ist derzeit nicht erstellen Sie die Input-Stream. Ich habe getestet, diese durch den Druck die aus zahlen, sondern nur 1 und 2 ausgedruckt. Ich bin sicher, dies ist nur ein kleines problem, dass im fehlt.
public class ObjectHandler implements Runnable{
Socket sock;
ObjectInputStream ois;
ObjectOutputStream oops;
InputStream is;
public ObjectHandler(Socket clientSocket) throws IOException {
System.out.println("1");
sock = clientSocket;
is = sock.getInputStream();
System.out.println("2");
ois = new ObjectInputStream(new BufferedInputStream(is));
System.out.println("3");
OutputStream os = sock.getOutputStream();
oops = new ObjectOutputStream(new BufferedOutputStream(os));
outputSockets.add(oops);
}
Habe ich jetzt entfernt, die throws IOException und umgeben den Leser mit einem try-catch. Nach dem der client abgestürzt ist es jetzt druckt dieser Fehler:
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at ThreadPool$ObjectHandler.<init>(ThreadPool.java:95)
at ThreadPool.addThread(ThreadPool.java:31)
at ObjectServerTest.go(ObjectServerTest.java:93)
at ObjectServerTest.main(ObjectServerTest.java:124)
- Sind Sie eine Ausnahme? Können Sie uns die stack-trace?
- Das ist nur ein Teil der stack-trace. Wir müssen alle sehen es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Bau-Objekt-Datenströme über sockets, Sie immer konstruieren müssen den Ausgabe-stream ersten und flush es sich vor der Erstellung der input-stream (wegen, wie die streams implementiert sind).
Entfernen
BufferedInputStream
. Sie brauchen es nicht. Es ist zu warten, bis 4K-Byte, gelesen werden.Bearbeiten:
entfernen
BufferedOutputStream
zu.Und stellen Sie sicher, dass Sie Spülen Sie die stream-Ausgabe auf der client-Seite.
Dies funktioniert für mich...
ObjectHandler:
Client: