2013-05-02 70 views
1

考慮下面的代碼:線程和網絡問題

Client c1 = new Client(); 
c1.connect("127.0.0.1",1300); 

連接功能:

public void connect(String serverName, int port) 
{ 
    try { 

     Socket socket = new Socket(serverName,port); 
     connection = new ConnectionProxy(socket); 
     connection.start(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

ConnectionProxy類擴展Thread):

public class ConnectionProxy extends Thread { 
private Socket socket; 
private InputStream is; 
private OutputStream os; 
private StringConsumer client; 

public ConnectionProxy(Socket socket) 
{ 
    this.socket = socket; 

    try { 
     is = socket.getInputStream(); 
     os = socket.getOutputStream(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
public void run() { 

    DataInputStream dis = new DataInputStream(is); 
    DataOutputStream dos = new DataOutputStream(os); 

    while (socket != null) 
    { 
     try { 
      String msg = dis.readUTF(); 
      System.out.println(msg); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 

我試圖實現聊天,我發現很難發送一個客戶寫的信息到當前所有的conn受影響的客戶。

我該怎麼做?我應該在服務器端持有每個對象(如c1)的引用,還是應該在服務器端持有ConnectionProxy線程? 如果不是,我該如何正確高效地實施?

想得到一些幫助! 謝謝!

回答

1

沒有給出太多的代碼,我會概述你想要做什麼來實現你的目標。

在您server

  • 保持一個類似的所有連接的client對象array什麼
  • client類實現一個send()功能
  • 實現一個broadcast()功能,通過客戶端列表循環和發送每個消息(使用前述的send()函數
  • 使s從您的列表中跟蹤(並刪除)任何已死或已斷開連接的clients,否則嘗試發送給他們會遇到麻煩。

在您client

  • 確保您關閉/斷開告訴server你要離開(方便了服務器刪除您)發送一個「終止連接」消息
0

服務器應爲每個傳入連接創建一個新的客戶端處理程序線程。

例如,在服務器端你可以試試:

ServerSocket server = new ServerSocket(port); 

    while (true) { 
     Socket client = server.accept(); 
     //add incoming client to connected clients vector. 
     HandleClient c = new HandleClient(client); 
     clients.add(c); 
    } 

創建和存儲的客戶在你的客戶的矢量後,您可以在HandleClient類的run()方法的bufferReader的實施(再次不一個必須)來獲得您的客戶文字