2016-10-05 125 views
0

我有一個正在工作的客戶端/服務器多線程程序。 我的問題是,我怎麼能選擇任何客戶端,並從服務器發送他的數據包?[C#] Socket編程,客戶端接口

+0

如果您的程序通過TCP套接字連接,那麼您將爲每個客戶端存儲一個套接字。將消息發送到相關的套接字。 – LordWilmore

+0

是的,我使用TCP套接字。但是我總是爲新客戶端創建一個新的Socket。另外我需要一個「列表」,但哪個? – ExclusivAtom

+0

是的,你爲每個客戶端創建一個新的套接字,所以如果你想發送一條消息給一個客戶端,然後通過你爲該客戶端存儲的套接字發送它。如果您不知道哪個套接字是針對哪個客戶端的,但您需要將其發送給特定的客戶端,那麼您需要從每個客戶端發送足夠的信息以允許服務器確定哪個客戶端是哪個客戶端。但這完全在你自己的控制之下。 – LordWilmore

回答

1

我最常做的,是建立一個Client類,它包含一個Socket,當有一個新的傳入連接,我創建了一個新的客戶端,並給了他當前的服務器實例(this),並定義了客戶端套接字。

Client類:

public class Client 
{ 
    public int Id; 
    public Socket socket; 
    public Server serverInstance; 

    public Client(Server server, Socket sock) 
    { 
     this.Id = GenerateNewUniqueId(); // Generates a unique id (you must implement it :p) 
     this.serverInstance = server; 
     this.socket = sock; 
    } 
} 

服務器接受連接:

List<Client> clients = new List<Client>(); 

// incoming connection 
void AcceptConnection() 
{ 
    Client newClient = new Client(this, serverSocket.Accept()); 

    clients.Add(newClient); 
} 

所以,如果你想發送給一個或所有客戶端,你可以做這樣的事情:

public void SendPacketToAll() 
{ 
    foreach (Client client in this.clients) 
     client.socket.Send(...); 
} 

public void SendPacketToUserById(int id) 
{ 
    foreach (Client client in this.clients) 
     if (client.Id == id) 
      client.socket.Send(...); 
} 

希望它有幫助,祝你好運

+0

謝謝你。但是,當我想向客戶端發送數據包時,我需要客戶端的事件嗎?當客戶收到信息包時,他們會看到。 – ExclusivAtom

+0

你有兩種方法可以用套接字接收數據。在客戶端或服務器端。在這裏的插座文檔:https://msdn.microsoft.com/en-us/library/system.net.sockets.socket(v=vs.110).aspx有一個名爲'BeginRevieve'的方法,需要回調方法。此方法用於異步進程。 如果你想要一個同步過程,你可以做一個while(true)語句,並且在這個循環中,你可以用'socket.Poll()'方法檢查是否有可用的數據。 – Eastrall

相關問題