3 Stimmen

Java Deadlock-Problem

Ich verwende Java-Sockets für die Kommunikation. Auf der Client-Seite habe ich einige Verarbeitung und an diesem Punkt sende ich ein Objekt an den Client. Der Code ist wie folgt:

while (true) {
  try {
    Socket server = new Socket("localhost", 3000);
    OutputStream os = server.getOutputStream();
    InputStream is = server.getInputStream();

    CommMessage commMessage = new CommMessageImpl();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(commMessage);
    os.write(bos.toByteArray());
    os.flush();

    byte[] buff = new byte[512];
    int bytesRead = 0;
    ByteArrayOutputStream receivedObject = new ByteArrayOutputStream();
    while ((bytesRead = is.read(buff)) > -1) {
      receivedObject.write(buff, 0, bytesRead);
      System.out.println(receivedObject);
    }
    os.close();
    Thread.sleep(10000);
  } catch (IOException e) {
  } catch (InterruptedException e) {
  }
}

Auf der Serverseite habe ich den folgenden Code, um das Objekt zu lesen und die Antwort zu schreiben (die nur eine Echo-Nachricht ist)

public void startServer() {
  Socket client = null;
  try {
    server = new ServerSocket(3000);
    logger.log(Level.INFO, "Waiting for connections.");
    client = server.accept();
    logger.log(Level.INFO, "Accepted a connection from: " + client.getInetAddress());
    os = new ObjectOutputStream(client.getOutputStream());
    is = new ObjectInputStream(client.getInputStream());

    // Read contents of the stream and store it into a byte array.
    byte[] buff = new byte[512];
    int bytesRead = 0;
    ByteArrayOutputStream receivedObject = new ByteArrayOutputStream();
    while ((bytesRead = is.read(buff)) > -1) {
      receivedObject.write(buff, 0, bytesRead);
    }

    // Check if received stream is CommMessage or not contents.
    CommMessage commMessage = getCommMessage(receivedObject);
    if (commMessage != null) {
      commMessage.setSessionState(this.sessionManager.getState().getState());
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(bos);
      oos.writeObject(commMessage);
      os.write(bos.toByteArray());
      System.out.println(commMessage.getCommMessageType());
    } else {
      processData(receivedObject, this.sessionManager);
    }
    os.flush();
    } catch (IOException e) {
    } finally {
      try {
        is.close();
        os.close();
        client.close();
        server.close();
      } catch (IOException e) {
    }
  }
}

Der obige Code funktioniert ok, wenn ich nicht versuchen, Daten auf der Client-Seite zu lesen (Wenn ich den Code im Zusammenhang mit dem Lesen ausschließen). Aber wenn ich diesen Code haben, aus irgendeinem Grund, bekomme ich eine Art von Deadlock beim Zugriff auf Input-Streams. Irgendwelche Ideen, was ich falsch gemacht haben könnte? Vielen Dank im Voraus.

5voto

finnw Punkte 46519

Sowohl Client als auch Server versuchen, den gesamten Eingabestrom zu lesen (d.h. alles bis EOF), aber keiner von beiden sendet ein EOF (durch Aufruf von shutdownOutput() an der Steckdose).

Warum müssen Sie die Objektdaten vorübergehend in einer ByteArrayOutputStream ? Dies wäre wahrscheinlich einfacher zu beheben, wenn Sie direkt aus dem Socket-Eingangsstrom lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X