2017-03-01 2 views
0

Ich versuche, eine Client-Server-Anwendung zu implementieren, in der der Server einige Objekte von den Clients akzeptieren kann und für jedes Objekt muss es als eine Nachricht interpretieren und handle es richtig. HierSocket Server akzeptiert nur eine Verbindung gleichzeitig auf dem gleichen Prozess

ist der Code:

(Server)

public class GlobalServer{ 
GlobalServer(){new Thread(() ->{ 
    try { 
     serverSocket = new ServerSocket(1234); 
     Socket clientSocket; 
     while (true) { 
      clientSocket = serverSocket.accept(); 
      handleClient(clientSocket); 
     } 
    } catch (IOException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
}).start(); 
} 

public void handleClient(Socket clientSocket) throws IOException, ClassNotFoundException{ 
    ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream()); 
    Object [] objArr = (Object[]) is.readObject(); 
    msgHandler(objArr, clientSocket); 
} 

public void msgHandler(Object [] objArr, Socket clientSocket){ 
    int msg_type = (int) objArr[0]; 
    switch (msg_type) { 
    case 1: 
     System.out.println("type 1 received"); 
     break; 
    case 2: 
     System.out.println("type 2 received"); 
     break; 
    case 3: 
     System.out.println("type 3 received"); 
     break; 

    default: 
     break; 
    } 
} 
public static void main(String [] args){ 
    GlobalServer s = new GlobalServer(); 
} 
} 

OBS: über die Anwendung es sinnvoll, ein Array von Objekten zu empfangen, macht, da jede Nachricht seinen Header trägt (die Art) und dessen Inhalt

(Client)

public class Client { 
    public static void main(String [] args){ 
     try { 
      Socket client = new Socket("192.168.0.105", 1234); 

      ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); 
      Object [] objArr = {3, "Type 3 message"}; 
      os.writeObject(objArr); 

      Object []objArr1 = {1, "Type 1 message"}; 
      os.writeObject(objArr1);   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 

I eine Instanz des GlobalServer auf einem separ laufen Aß Maschine und auf einem anderen Rechner verbinde ich mich mit dem Server und sende nacheinander zwei Nachrichten. Das Problem besteht darin, dass der Server nur die erste Nachricht empfängt und verarbeitet und die zweite Nachricht verloren geht und der Client beendet wird, ohne dass der Server diese zweite Nachricht erhält. Die seltsame Sache ist, dass, wenn ich diese zwei Nachrichten als zwei verschiedene Anwendungen sende, der Server es gut behandelt. Es hat etwas damit zu tun, dass die zwei Nachrichten auf demselben Prozess gesendet werden?

-Code arbeitet als diferent aplications:

(Nachricht 1)

public class Message1 { 
    public static void main(String [] args){ 
     try { 
      Socket client = new Socket("192.168.0.105", 1234); 

      ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); 

      Object [] objArr = {3, "Type 3 message"}; 
      os.writeObject(objArr); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 

(Nachricht 2)

public class Message2 { 
    public static void main(String [] args){ 
     try { 
      Socket client = new Socket("192.168.0.105", 1234); 

      ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); 

      Object []objArr1 = {1, "Type 1 message"}; 
      os.writeObject(objArr1);   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 
+0

versuchen Ihre Objekte Spülung nach dem Schreiben sie durch os.flush() – Sanjeev

+0

Gleiche zu Object, Griffe die erste ignoriert dann die zweite auf den gleichen Prozess –

Antwort

1

Problem ist in folgenden Codeblock:

public void handleClient(Socket clientSocket) throws IOException, ClassNotFoundException{ 
    ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream()); 
    Object [] objArr = (Object[]) is.readObject(); 
    msgHandler(objArr, clientSocket); 
} 

Du bist nur re ein Objekt hinzufügen. (Object[]) is.readObject(); soll in einer Schleife aufgerufen werden, um mehrere Objekte zu lesen und die Methode msgHandler für jedes Objekt aufzurufen.

hoffe, das hilft

+1

Danke, das funktioniert. Setzen Sie einfach eine Endlosschleife auf diesen Abschnitt, den Sie erwähnt haben, und alles hat gut funktioniert –

Verwandte Themen