注意在上面圖中,兩個主機是對等的,但是按照約定,我們將發起請求的一方稱為客戶端,將另一端 稱為服務端。可以看出兩個程序之間的對話是通過套接字這個出入口來完成的,實際上套接字包含的最重 要的也就是兩個信息:連接至遠程的本地的端口信息(本機地址和端口號),連接到的遠程的端口信息(遠 程地址和端口號)。注意上面詞語的微妙變化,一個是本地地址,一個是遠程地址。
這裡又出現了了一個名詞端口。一般來說我們的計算機上運行著非常多的應用程序,它們可能都需要 同遠程主機打交道,所以遠程主機就需要有一個ID來標識它想與本地機器上的哪個應用程序打交道,這裡 的ID就是端口。將端口分配給一個應用程序,那麼來自這個端口的數據則總是針對這個應用程序的。有這 樣一個很好的例子:可以將主機地址想象為電話號碼,而將端口號想象為分機號。
在.NET中,盡管我們可以直接對套接字編程,但是.Net提供了兩個類將對套接字的編程進行了一個封 裝,使我們的使用能夠更加方便,這兩個類是TcpClIEnt和TcpListener,它與套接字的關系如下:
從上面圖中可以看出TcpClient和TcpListener對套接字進行了封裝。從中也可以看出,TcpListener用 於接受連接請求,而TcpClient則用於接收和發送流數據。這幅圖的意思是TcpListener持續地保持對端口 的偵聽,一旦收到一個連接請求後,就可以獲得一個TcpClient對象,而對於數據的發送和接收都有 TcpClIEnt去完成。此時,TcpListener並沒有停止工作,它始終持續地保持對端口的偵聽狀態。
我們考慮這樣一種情況:兩台主機,主機A和主機B,起初它們誰也不知道誰在哪兒,當它們想要進行 對話時,總是需要有一方發起連接,而另一方則需要對本機的某一端口進行偵聽。而在偵聽方收到連接請 求、並建立起連接以後,它們之間進行收發數據時,發起連接的一方並不需要再進行偵聽。因為連接是全 雙工的,它可以使用現有的連接進行收發數據。而我們前面已經做了定義:將發起連接的一方稱為客戶端 ,另一段稱為服務端,則現在可以得出:總是服務端在使用TcpListener類,因為它需要建立起一個初始 的連接。
2.網絡聊天程序的三種模式
實現一個網絡聊天程序本應是最後一篇文章的內容,也是本系列最後的一個程序,來作為一個終結。 但是我想後面更多的是編碼,講述的內容應該不會太多,所以還是把講述的東西都放到這裡吧。