2017-04-07 4 views
1

Ich baue eine Client-Server-Java-Anwendung. Das Problem ist, dass, wenn ich Integer mit writeInt() sende, es manchmal auf readInt() blockiert.Sockets readInt funktioniert nicht immer

Kunde

PrintWriter socketOut = new PrintWriter(sock.getOutputStream()); 
DataOutputStream d = new DataOutputStream(sock.getOutputStream()); 
String s = "User"; 
socketOut.println(s); 
socketOut.flush(); 
d.writeInt(data[0]); 
d.flush(); 
d.writeInt(data[1]); 
d.flush(); 

Server

while(true){ 
     System.out.println("Listening for clients..."); 
     clientSock = serverSock.accept(); 
     Scanner in = new Scanner(clientSock.getInputStream()); 

     String clientType = in.nextLine(); 

     switch(clientType){ 
      case "Resource": 
       new Thread(new ResourceService(clientSock)).start(); 
       break; 
      case "User": 
       new Thread(new UserService(clientSock)).start(); 
       break; 
     } 

    } 

Benutzer-Thread

@Override 
    public void run(){ 
     try{ 
     DataInputStream input = new DataInputStream(user.getInputStream()); 
     int i = 0; 
     int a = input.readInt(); // Sometimes it blocks here. 
     int b = input.readInt(); 
     System.out.println(a); 
     System.out.println(b); 
     ... 

ich zwischen Kunden auf der ersten Zeichenfolge an den Server gesendet Basis zu unterscheiden bin versucht. Manchmal liest der Server den Int und manchmal blockiert er. Ein Beispiel für Ausgabe lautet:

Listening for clients... 
Listening for clients... 
Listening for clients... 
Listening for clients... 
Listening for clients... 
1      // here the server didn't block 
100000 
Listening for clients... 

Antwort

2

wahrscheinlich keine gute Idee Datainputstream/Dataoutputstream gemischt zusammen mit Scanner und Printwriter zu verwenden. Scanner und PrintWriter werden mehr für die Benutzerinteraktion empfohlen.

Versuchen Sie, nur DataOutputStream und DataInputStream zu verwenden.

Kunde

DataOutputStream d = new DataOutputStream(sock.getOutputStream()); 
String s = "User"; 
d.writeUTF(s); 
d.writeInt(data[0]); 
d.flush(); 
d.writeInt(data[1]); 
d.flush(); 

Server

DataInputStream input = new DataInputStream(clientSock.getInputStream()); 
String clientType = input.readUTF(); 

switch(clientType){ 
    case "Resource": 
     new Thread(new ResourceService(input)).start(); 
     break; 
    case "User": 
     new Thread(new UserService(input)).start(); 
     break; 

Benutzer-Thread

int a = input.readInt(); 
int b = input.readInt(); 
System.out.println(a); 
System.out.println(b); 

Anmerkung 1: Datainputstream/Dataoutputstream ein eigenes Protokoll verwenden, um UTF Strings zu schreiben/lesen, keine Notwendigkeit zu verwenden eine Leitungsbeendigung.

Hinweis 2: Methoden von PrintWriter werfen keine E/A-Ausnahmen, Sie müssen überprüfen, checkError aufrufen (wahrscheinlich nicht das Problem hier).

+1

Es funktioniert jetzt. Vielen Dank! –

Verwandte Themen