Java-Sockets: Kein Pufferspeicher verfügbar (maximale verbindungen erreicht?)

Ich habe ein großes problem. Ich entwickelte eine client-server-Anwendung. Ein client-thread sendet ein serialisiertes Objekt auf dem server und der server sendet ein serialisiertes Objekt. Derzeit bin ich mit ein server und 10 client-threads und nach etwa 30 Sekunden bekomme ich die Fehlermeldung von jeder client-thread (IOException):

Kein Pufferspeicher verfügbar (maximale verbindungen erreicht?): verbinden

Wenn ich mich in netstat dann sehe ich, dass es eine Menge von verbindungen erstellt, und es wächst und wächst und alle verbindungen sind in TIME_WAIT Zustand.

Ich weiß nicht, warum. Ich schließen der sockets im server und in den clients immer in einen finally-block. Hier einige code:

In der server habe ich in socketHandlerThread:

ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(5000);
while(true) {
       Socket socket = serverSocket.accept();
}

Die neue Fassung wird dann auf einer LinkedBlockingQueue und ein worker-thread nimmt die Steckdose und macht die folgenden:

try {
      outputStream = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
      outputStream.flush();
      inStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
      ClientRequest clientRequest = (ClientRequest) inStream.readObject();
...
      outputStream.writeObject(serverResponse);
      outputStream.flush();
} catch....
} finally {
                if (inStream != null) {
                    inStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
                if (socket != null) {
                    socket.close();
                }
}

Auf der client-Seite habe ich folgenden code:

    try {
        socket = new Socket(host, port);
        outputStream = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        outputStream.flush();
        inputStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
        outputStream.writeObject(request);
        outputStream.flush();
        Object serverResponse = inputStream.readObject();
   } catch....
   } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
            if (socket != null) {
                socket.close();
            }
   }

Kann jemand helfen? Ich weiß wirklich nicht, was für Fehler ich gemacht habe. Ich scheint, dass die buchsen bekommen, nicht geschlossen, aber ich weiß nicht, warum.

Könnte es sein, das problem, dass ich die sockets in eine Warteschlange auf dem server-Seite, so dass die Buchse irgendwie kopiert?

Edit: Wenn ich dem client und dem server jeweils auf einem anderen Amazon EC2-classic-Instanz mit Linux AMI, dann funktioniert es. Könnte es ein problem mit Windows oder ist das problem einfach, dass ich mit den Clients und dem Server auf der gleichen Maschine (mein lokaler pc)?

Nicht jemand sieht einen Fehler in meinem code?

Edit2: Wie oben schon gesagt, auf EC2-Instanzen funktioniert es aber wenn ich netstat zeigt es immer noch eine Menge von Linien, die sagen TIME_WAIT.

Hier sind screenshots:

https://drive.google.com/file/d/0BzERdJrwWrNCWjhReGhpR2FBMUU/view?usp=sharing

https://drive.google.com/file/d/0BzERdJrwWrNCOG1TWGo5YmxlaTg/view?usp=sharing

Erste screenshot ist von windows. "WARTEND" bedeutet "WARTEN" (es ist Deutsch).

Der zweite screenshot ist von Amazon EC2 (auf der linken Seite der client-Rechner, rechts der server-Maschine).

  • Nur ein Gedanke-warum nicht, RMI? RMI übernimmt die socket-thread-Problem.
  • Ich habe mit diesem Stil leider.
  • Was sagt netstat wirklich sagen? 'Waiting' ist nicht ein port state.
  • Ich aktualisiert meine Frage
  • Aber Sie haben nicht beantwortet meine. netstat kann drucken Sie ein Dutzend oder so Staaten, aber 'Warten' ist nicht einer von Ihnen. Es gibt mehrere mit _WAIT im Namen. Welche ist es?
  • Welchen Befehl muss ich setzen? Einfach nur zu schreiben "netstat" in die Kommando-Konsole? Oder mit ein paar Argumenten?
  • Ich Frage Sie, was Sie schon gedruckt. Wenn Sie nicht wissen, wie Sie laufen ich sehe nicht, wie Sie möglicherweise können Sie behaupten, dass es nicht gedruckt überhaupt nichts. Sie könnten versuchen netstat -anp tcp zu bekommen-Ausgabe nur für TCP, aber bitte melden Sie es genau. Fügen Sie eine Zeile oder zwei der seinen Ausgang in der Frage.
  • Sie versuchen, zu viele verbindungen zu schnell und läuft die lokalen ports. Wenn, dann aufgrund eines Fehlers, den Fehler beheben. (Warum nicht Sie verbindungen wiederverwenden?!) Wenn Sie wirklich versuchen, so viele verbindungen, die Sie benötigen zu fangen, in diesem Fall warten Sie etwas, und versuchen Sie es erneut.
  • Können Sie versuchen, was passiert, wenn auf der server-Seite setzen Sie in einer Thread.sleep(3000); bevor Sie beginnen, schließen Sie die Buchse?
  • Ich habe ein paar screenshots Hinzugefügt

InformationsquelleAutor machinery | 2014-10-16
Schreibe einen Kommentar