[C#.NET] 簡易TcpListener/TcpClient使用方式
把最近學到的技巧再拿來分享一下,希望有新手遇到類似的問題也能夠得到幫助。
這次的目標是利用socket的方式建立兩台機器的TCP/IP連線,然後再利用這個連線做檔案傳輸的動作。首先先了解一下待會所會用到的物件,第一個要介紹的就是IPEndPoint,我們可以把IPEndPoint想成是IP+Port所組成的一個物件。第二個就是主角socket了,socket是在1983年從柏克萊大學所釋出的函式庫,socket把檔案視為串流的方式讓其可在網路架構上流通。這次選擇使用TcpListener/TcpClient的方式,因為該物件已經把socket包起來,所以使用上相對簡易。首先我們先來看看海角點部落裡提供的TCP socket連線流程圖,再來看看這次我們想要達成的目標:
接下來看看這次方案裡的三個專案:
- ConsoleServer - 主機
- ConsoleClient - 客戶端
- CommunicationBase - 主機和用戶端都需要用到傳送及接收的功能,所以把它抽出來讓兩邊都可以加入參考使用
先看看主機端長什麼樣:
























//取得本機IP



//建立本機端的IPEndPoint物件


//建立TcpListener物件


//開始監聽port



TcpClient tmpTcpClient;








if (tmpTcpClient.Connected)



















這邊有幾個要注意的重點:
- 建立IPEndPoint端點需要IPAddress跟Port
- TcpListener是主機專用 - 專門用來聽port是否有從客戶端來的連線request
- 在while裡有使用到thread,因為我們假設主機host起來之後可能會有一個以上的client連線進來,thread的使用方式可以參考msdn
接著看看主機端裡的HandleClient長什麼樣:















































HandleClient裡面只有一個Communicate()的方法,是用來傳送及接收訊息,而在稍早提到因為傳送及接收的功能主機及客戶端都會使用到,所以在這裡需先new一個CommunicationBase的物件再使用其傳送及接收的方法:
- cb.ReceiveMsg()
- cb.SendMsg()
再來看看CommunicationBase長什麼樣:










































if (ns.CanRead)












這邊有幾個要注意的重點:
- 不管傳送或接收都需要用 NetworkStream ns = tmpTcpClient.GetStream() 的方法來驅動
- 訊息需先轉成byte[]陣列才可傳送 - Encoding.Default.GetBytes()
- 傳送 - ns.Write();
- 相對地收到訊息時需先從byte[]陣列轉回一般字串 - Encoding.Default.GetString()
- 接收 - ns.Read()
最後來看看Client長什麼樣:























//先建立IPAddress物件,IP為欲連線主機之IP


//建立IPEndPoint


//先建立一個TcpClient;






























程式裡的註解應該都很清楚,希望能讓有需求的新手可以縮短research的時間。
結果跑出來會像是這樣:
謝謝收看