2014-08-28 247 views
-1

在我的服務器類中,我必須一次向所有連接的客戶端發送幾條不同數據類型的消息從服務器向多個客戶端發送多條消息

public class Server() { 

    private List<ClientT> client = new ArrayList<ClientT>();   
    private String strValue = "someText";     
    private int intValue = 20; 
    private int intValueTwo = 20; 

    try { 
      for(int i = 0; i < client.size(); i++) { 
       client.get(i).output.writeObject(strValue); 
       client.get(i).output.writeObject(intValue); 
       client.get(i).output.writeObject(intValueTwo); 
      }   
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    class ClientT extends Thread { 
     private ObjectOutputStream output; 
     /* ... 
      ... 
      ... */ 
} 

在我的客戶端類中,我使用了lineNumbers來檢測從服務器發送哪條消息。

ObjectInputStream input; 
    int lineNo = 0; 
    String message = " "; 
    try {  
     input = new ObjectInputStream(socket.getInputStream()); 

     while(true) { 
      lineNo++; 
      message = (Object) input.readObject(); 

      if(lineNo == 1) { 
       //read first message from the server 
      } 
      else if(lineNo == 2) { 
       //read second message from the server 
      } 
      else if(lineNo == 3) { 
       //read third message from the server 
      } 

    } catch (IOException exception) { 
      System.out.println("Error: " + exception); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

而不是使用行號來標識從服務器類發送的消息,什麼是更好的選擇?

+0

我想給你一個有用的評論,但你的問題是「什麼是更好的選擇?」簡直太寬了 – ControlAltDel 2014-08-28 19:39:38

+0

因爲我覺得我對它進行了硬編碼。如果我有超過3個信息從服務器傳遞到客戶端會怎麼樣?假設我有10個來自服務器的信息。我不想寫if(lineNo == 4)和(line == 5)直到10. – user2935569 2014-08-28 19:43:19

+1

由於您使用的是ObjectInputStream,因此您可以將所需的值放入一個(可序列化的)對象中,發送。 Java會照顧你的訂單。 – 2014-08-28 20:00:47

回答

0

與任何TCP/UDP數據包一樣,連接字節並將它們發送給應該知道該協議的客戶端,因此需要讀取多少字節以及何時讀取或者如果您使用可變長度的消息,則使用仍需要的分隔符由客戶端解析。

如果使用字節緩衝區,這可能會幫助您:

public static String getStringFromByteBuffer(ByteBuffer bb) { 
    StringBuilder message = new StringBuilder(); 
    int bytes; 
    while(true) { 
     try { 
      bytes = bb.get(); 
       // format the product of two bytes and a bitwise AND with 0xFF 
      message.append("\\x"+String.format("%02x", bytes&0xff)); 
     } catch (Exception e) { 
      break; 
     } 
    } 
    return message.toString(); 
} 

這裏一些示例代碼來處理與插座的(客戶)的InputStream傳入的字節流:

byte[] lengthArray = new byte [someSize]; 
    this.in.readFully(lengthArray, 0, 4); 
    this.busy = true; 
    ByteBuffer lengthBuffer = ByteBuffer.wrap(lengthArray); 
    byte[] tcpArray = new byte[length]; 
    // read message from the remote parent peer of this instance 
    this.in.readFully(tcpArray, 0, length); 
    // load message into ByteBuffer container for convenience 
    ByteBuffer tcpInput = ByteBuffer.wrap(tcpArray); 

好運!

相關問題