2013-02-26 35 views
3

我正在製作一個簡單的聊天客戶端以獲得樂趣,我有Server/Client工作並完美髮送數據。我想知道如何將數據發送給選定的用戶。選擇部分我可以解決,但我不知道如何將東西發送到選定的IP。到目前爲止,這是我的服務器。Java,將數據發送到不同的IP

package Server; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* @class Connect 
* @date Feb 25, 2013 10:14:00 PM 
* @author Zach 
*/ 

public class Connect { //Server 
    public static void main(String[] args) throws IOException { 
     ServerSocket server = new ServerSocket(43595); 

     while (server.isBound()) { 

      Socket s = server.accept(); 
      DataOutputStream out = new DataOutputStream(s.getOutputStream()); 
      DataInputStream in = new DataInputStream(s.getInputStream()); 

      int length = in.read(); 
      byte[] data = new byte[length]; 
      in.read(data); 
      String str = new String(data, "UTF-8"); 

      s.close(); 
     } 
    } 
} 

我要關閉服務器的重定向信息給特定的客戶端

回答

1

讓接受的套接字的數組,你的情況從「S」插座,然後可以循環它找到該客戶端發送數據到。

+0

我想能夠發送到任何IP,那仍然工作? – zfollette 2013-02-26 18:02:18

+0

是的,你可以在接收到數據之後,循環數組並將其發送給所有連接的客戶端(使用我告訴你的數組) – 2013-02-26 18:07:58

+0

可能是'List'或者'Map',將會是更好的選擇,因爲該陣列採用固定大小。 – afsantos 2013-02-26 21:07:38

0

作出這樣的處理每個客戶端類:

public class ClientHandler { 

Socket connection; 
DataInputStream in; 
DataOutputStream out; 

public ClientHandler(Socket s) { 
    connection = s; 
} 
public void startup() throws IOException { 
    in = new DataInputStream(connection.getInputStream()); 
    out = new DataOutputStream(connection.getOutputStream()); 
    out.flush(); 
} 

public void sendMessage(byte[] message) throws IOException { 
    out.write(message); 
} 

} 

把一個列表,你的服務器和ID分配給每個ClientHandler的,那麼你可以通過你的清單,如果ID匹配循環,使用的sendMessage()在客戶端。

我建議你使用緩衝區作爲輸入和輸出,因爲它們更高效。 我也建議你在服務器類中使用線程,尤其是在處理多個客戶端時。

+0

當使用套接字時,首先打開OutputStream是個好習慣。 – afsantos 2013-02-26 21:04:43