2011-10-18 50 views
2

我正嘗試使用Java創建一個簡單的聊天程序。我已經創建了接受多個客戶端的TCP服務器。目前客戶端發送消息給服務器。如何從服務器連接兩個客戶端

  1. 如何將消息從一個客戶端廣播到所有其他客戶端?
  2. 如何配對兩個客戶端。發送和接收消息給海誓山盟?
+0

您是否試圖進行點對點聊天? – ewok

+0

是的。客戶端到服務器到客戶端的連接 – explorer

回答

1

1.如何將消息從一個客戶端廣播到所有其他客戶?

使用訂閱/通知機制

我2.How可以配對兩個客戶機中。發送和接收消息給海誓山盟?

客戶端也必須偵聽服務器套接字。

更新:
您的服務器將有某種註冊表,您的所有客戶端註冊通知。
客戶端打開等待消息的服務器套接字。
當客戶想要發送消息時,它連接到服務器,發送消息,服務器可以將消息發送給所有註冊客戶或發送給應該接收消息的特定客戶。在這部分服務器連接到客戶端的服務器套接字併發送消息。
另一個選項不是在客戶端打開服務器套接字,但客戶端進行輪詢以查看服務器是否有可用消息

+0

客戶端有套接字偵聽。我如何將客戶端與服務器上的每個客戶端連接起來? – explorer

+0

客戶端連接到服務器的套接字並將消息發送到服務器。您還必須爲您的客戶端打開一個服務器套接字,以便它可以接受來自其他客戶端/對等端的連接。除非您希望將服務器用作中介。您想要做什麼? – Cratylus

+0

是的。我希望服務器調解通信,因爲任何用戶都可以嘗試連接到任何其他用戶。服務器將找到正確的目標,然後加入它們。 – explorer

2

您可以使您的客戶端通過簡單的套接字進行通信。一旦服務器發送客戶端的IP,您可以使用客戶端的IP和TCP端口(通常爲443)進行通信。我在C中知道它的完成方式,我不確定你是否可以在你的Java實現中使用它,但類似的東西可以工作。

//#define MSG "GET/HTTP/1.0\r\n\r\n"  
char buffer[128]= "0"; 

    struct sockaddr_in  sin; 
    struct hostent   *host; 
    int       s; 

    host = gethostbyname("Clients IP"); 

    memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
    //sin.sin_addr.s_addr = inet_addr("175.41.153.196"); 
    sin.sin_family = host->h_addrtype; 
    //sin.sin_family = AF_INET; 
    sin.sin_port = htons(443); 
    // Create socket port 443 
    s = socket(AF_INET, SOCK_STREAM,0); 
    // 1. Block for server accept 
    connect(s, (struct sockaddr*)&sin,sizeof(sin));  
    // 2. Send "Hello world"  
    send(s,buffer,strlen(buffer)+1,0); 
    // 3. Block for receive 
    recv(s,buffer,sizeof(buffer),0); 
    // Print received data 


    close(s); 

    //return 0; 

然後,您可以使用Send和Recv函數在客戶端之間發送和接收數據。

0
  1. 創建一個線程,該線程將處理一個ServerSocket接受 連接。
  2. 通過連接 使客戶端向服務器發送唯一標識符。
  3. 當客戶端發送消息時,使用所需的接收方 客戶端的ID作爲參數,或者爲空,發送給所有客戶端。