2016-04-29 7 views
0

Ich benutze ServerSocket, um Daten vom Client in einer while-Schleife zu erhalten, es funktioniert bei der ersten Ausführung, schlägt aber nach der zweiten Runde fehl.ServerSocket empfängt keine Daten in einer Schleife

Ich habe einige Suche, aber immer noch nicht herausfinden, was passiert ist.

Server-Side-Code

package com.gorilla.main; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server2 { 

    public static void main(String[] args) throws Exception { 

     ServerSocket serverSocket = new ServerSocket(44444); 

     while(true){ 

     System.out.println("another round"); 

     Socket socket = serverSocket.accept(); 
     InputStream inputStream = socket.getInputStream(); 

     System.out.println("available: "+ inputStream.available()); 

     byte[] b = new byte[inputStream.available()]; 

     inputStream.read(b); 

     System.out.println(new String(b)); 
     System.out.println("======================="); 

     socket.close(); 
     } 
    } 
} 

Clent Seitencode

package com.gorilla.main; 

import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class Client2 { 

    public static void main(String [] args) throws Exception{ 

     Socket socket = new Socket("127.0.0.1", 44444); 
     String s = "Hello World"; 
     byte [] b = s.getBytes(); 
     socket.getOutputStream().write(b);; 
     socket.close(); 

    } 
} 

und der Ausgang an Server Seitenkonsole, nachdem ich Client-3-mal lief.

another round 
available: 11 
Hello World 
======================= 
another round 
available: 0 

======================= 
another round 
available: 0 

======================= 
another round 

Jeder Vorschlag wäre willkommen. Vielen Dank.

Antwort

2

Sie verwenden InputStream.available(), um Ihren Puffer zu bemessen, und das ist nicht, wie man von einem Sockel liest. Sie sollten einen Puffer zuweisen (Größe in der Regel statisch, oder vielleicht konfigurierbar) und

// server code 
byte[] buffer = new byte[4096]; 
int bytesRead; 
while ((bytesRead = in.read(buffer)) > -1) { 
    // do something 
} 

Die Javadoc von InputStream.available():

in einer Schleife lesen Gibt eine Schätzung der Anzahl von Bytes, die gelesen werden können (oder übersprungen) aus diesem Eingangsstrom ohne Blockierung durch den nächsten Aufruf einer Methode für diesen Eingangsstrom . Der nächste Aufruf könnte der gleiche Thread oder ein anderer Thread sein. Ein einzelnes Lesen oder Überspringen von diese vielen Bytes werden nicht blockiert, sondern können weniger Bytes lesen oder überspringen.

Wenn Ihr Protokoll textbasierte, können Sie den Eingangsstrom des Sockets wickeln in einem Scanner und damit die Schleife wird

while (scanner.hasNextLine()) { 
    String line = scanner.next(); 
} 
+0

Es funktioniert. Aber warum kann ich etwas aus einem inputStream lesen, wenn inputStream.available() 0 ist? Hast du Ideen? –

+0

Und danke für deine Antwort !! –

+0

Ihr Anwendungsfall erfordert nicht 'available()'. Lies einfach (es ist ein blockierender Anruf) und konfiguriere das Timeout – Raffaele