2017-06-18 83 views
0

我是socket編程的新手。我正在開發客戶端 - 服務器通信程序,並且在客戶端連接到服務器時顯示客戶端名稱而不是IP地址時遇到困難。任何人都可以給我一個好的方法嗎?我該怎麼做?我需要知識產權以進一步溝通。 這裏是我的客戶端代碼:C#Socket編程:如何通過名稱來識別客戶端不是IP

mTcpClient = new TcpClient(); 
mTcpClient.BeginConnect(ipa, nPort, onCompleteConnect, mTcpClient); 

這onCompleteConnect功能:

void onCompleteConnect(IAsyncResult iar) 
    { 

     TcpClient tcpc; 

     try 
     { 
      tcpc = (TcpClient)iar.AsyncState; 
      tcpc.EndConnect(iar); 
      mRx = new byte[512]; 
      tcpc.GetStream().BeginRead(mRx, 0, mRx.Length, onCompleteReadFromServerStream, tcpc); 

     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.Message); 
     } 
    } 

現在,我想送客戶的名稱,以及在服務器端接收。我該怎麼辦?

+0

當您連接使用字符串連接語句中既然你已經有了名字。一個簡單的技巧是讓一個自定義類繼承TcpClient並添加一個名爲ClientName的屬性。或者創建一個狀態對象(如在msdn示例中),並將客戶端名稱作爲屬性存儲在狀態對象中。 – jdweng

回答

1

使用StreamWriterStreamReader來讀取字符串。

客戶:

StreamWriter sW = new StreamWriter(mTcpClient.GetStream()); 
sW.AutoFlush = true; 

// Send the username 
sW.WriteLine(Environment.UserName); 

服務器:

StreamReader sR = new StreamReader(mTcpClient.GetStream()); 

// Read the username (waiting for the client to use WriteLine()) 
String username = sR.ReadLine(); 
+0

謝謝,像一個魅力工作。 –

2

Environment.UserName屬性從客戶端發送到服務器。

+0

謝謝,但我有程序設置中的用戶名。我想在連接到服務器時將該用戶名發送到服務器。 此行服務器對我的IP客戶端的 新ClientNode(tclient,新字節[512],新的字節[512],tclient.Client.RemoteEndPoint.ToString()))); –

+0

使用該字節緩衝區,可以將前4個字節填充爲表示「用戶」的標題,後續508字節用於發送用戶名。由於用戶名最有可能不會是508字節,所以您需要將緩衝區的空字節添加到緩衝區,然後從客戶端發送它。服務器應讀取前4個標題字節,然後讀取下一個508字節作爲用戶名。服務器應刪除添加到緩衝區的尾隨空字節,然後您應該擁有用戶名。 – Ben