2017-03-01 56 views
0

我試圖實現一個客戶端 - 服務器應用程序,其中服務器可以接受來自客戶端的一些對象,並且對於每個對象,它必須將其解釋爲消息並且妥善處理。套接字服務器在同一個進程中一次只接受一個連接

下面是代碼:

(服務器)

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:上的應用是有意義,因爲每個消息中攜帶它的報頭(類型)和它的內容爲接收對象的陣列

(客戶端)

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(); 
     } 
    } 
    } 

我對組合通道運行GlobalServer的實例吃了機器,並在另一臺機器上連接到服務器,並順序發送兩條消息。問題在於服務器只接收並處理第一條消息,第二條消息丟失,客戶端沒有服務器接收到第二條消息。奇怪的是,如果我將這兩個messagens作爲兩個不同的aplications發送,服務器就可以很好地處理它。這與在同一過程中發送的兩條消息有關嗎?

代碼工作作爲diferent aplications:

(消息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(); 
     } 
    } 
    } 

(消息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

嘗試寫他們通過os.flush到的ObjectOutputStream() – Sanjeev

+0

同樣的事情後,沖洗你的對象,然後處理第一個忽略了同樣的過程 –

回答

1

問題是在下面的代碼塊:

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

你只是重新添加一個對象。應在循環中調用(Object[]) is.readObject();以讀取多個對象併爲每個對象調用msgHandler方法。

希望這有助於

+1

謝謝,工作第二。只要在你提到的這個部分放上一個無限循環,每件事情都可以正常工作 –

相關問題