Visual C 網路程式設計之TCP

2021-04-15 13:45:45 字數 3489 閱讀 8736

前一篇《visual c#.net網路程式開發之socket》中說到:支援http、tcp和udp的類組成了tcp/ip三層模型(請求響應層、應用協議層、傳輸層)的中間層-應用協議層,該層的模擬位於最底層的socket類提供了更高層次的抽象,它們封裝 tcp 和 udp 套接字的建立,不需要處理連線的細節,這使得我們在編寫套接字級別的協議時,可以更多地嘗試使用 tcpclient 、 udpclient和tcplistener,而不是直接向 socket 中寫。它們之間的這種層次關係示意如下:

可見,tcpclient 類基於 socket 類構建,這是它能夠以更高的抽象程度提供 tcp 服務的基礎。正因為這樣,許多應用層上的通訊協議,比如ftp(file transfers protocol)檔案傳輸協議、http(hypertext transfers protocol)超文字傳輸協議等都直接建立在tcpclient等類之上。

tcpclient 類使用 tcp 從 internet 資源請求資料。tcp 協議建立與遠端終結點的連線,然後使用此連線傳送和接收資料報。tcp 負責確保將資料報傳送到終結點並在資料報到達時以正確的順序對其進行組合。

從名字上就可以看出,tcpclient類專為客戶端設計,它為 tcp 網路服務提供客戶端連線。tcpclient 提供了通過網路連線、傳送和接收資料的簡單方法。

1、public tcpclient()當使用這種不帶任何引數的建構函式時,將使用本機預設的ip位址並將使用預設的通訊埠號0。這樣情況下,如果本機不止乙個ip位址,將無法選擇使用。以下語句示例了如何使用預設建構函式來建立新的 tcpclient:

tcpclient tcpclientc = new tcpclient();

iphostentry ipinfo=dns.gethostbyname("www.tuha.net");//主機資訊

ipaddresslist iplist=ipinfo.addresslist;//ip位址陣列

ipaddress ip=iplist[0];//多ip位址時一般用第乙個

ipendpoint ipep=new ipendpoint(ip,4088);//得到網路終結點

try

catch (exception e )

到這裡,你可能會感到困惑,客戶端要和服務端建立連線,所指定的ip位址及通訊埠號應該是遠端伺服器的呀!事實上的確如此,使用以上兩種建構函式,你所實現的只是tcpclient例項物件與ip位址和port埠的繫結,要完成連線,你還需要顯式指定與遠端主機的連線,這可以通過tcpclient類的connect方法來實現, connet方法使用指定的主機名和埠號將客戶端連線到 遠端主機:

1)、public void connect(ipendpoint); 使用指定的遠端網路終結點將客戶端連線到遠端 tcp 主機。

public void connect(ipaddress, int); 使用指定的 ip 位址和埠號將客戶端連線到 tcp 主機。

public void connect(string, int); 將客戶端連線到指定主機上的指定埠。

需要指出的是,connect方法的所有過載形式中的引數ipendpoint網路終結點、ipaddress以及表現為string的dns主機名和int指出的port埠均指的是遠端伺服器。

以下示例語句使用主機預設ip和port埠號0與遠端主機建立連線:

tcpclient tcpclient = new tcpclient();//建立tcpclient物件例項

try

catch (exception e )

3、public tcpclient(string, int);初始化 tcpclient 類的新例項並連線到指定主機上的指定埠。與前兩個建構函式不一樣,這個建構函式將自動建立連線,你不再需要額外呼叫connect方法,其中string型別的引數表示遠端主機的dns名,如:www.tuha.net。

以下示例語句呼叫這一方法實現與指定主機名和埠號的主機相連:

try

catch (exception e )

同其它繼承自抽象基類stream的所有流一樣,networkstream網路流也可以被視為乙個資料通道,架設在資料**端(客戶client)和接收端(服務server)之間,而後的資料讀取及寫入均針對這個通道來進行。

.net框架中,networkstream流支援兩方面的操作:

1、 寫入流。寫入是從資料結構到流的資料傳輸。

2、讀取流。讀取是從流到資料結構(如位元組陣列)的資料傳輸。

與普通流stream不同的是,網路流沒有當前位置的統一概念,因此不支援查詢和對資料流的隨機訪問。相應屬性canseek 始終返回 false,而 seek 和 position 方法也將引發 notsupportedexception。

基於socket上的應用協議方面,你可以通過以下兩種方式獲取networkstream網路資料流:

1、使用networkstream建構函式:public networkstream(socket, fileaccess, bool);(有過載方法),它用指定的訪問許可權和指定的 socket 所屬權為指定的 socket 建立 networkstream 類的新例項,使用前你需要建立socket物件例項,並通過socket.connect方法建立與遠端服務端的連線,而後才可以使用該方法得到網路傳輸流。示例如下:

socket s=new socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp);//建立客戶端socket物件例項

try

catch(exception e)

try

2、通過tcpclient.getstream方法:public networkstream etstream();它返回用於傳送和接收資料的基礎網路流networkstream。getstream 通過將基礎 socket 用作它的構造函式引數來建立 networkstream 類的例項。使用前你需要先創tcpclient物件例項並建立與遠端主機的連線,示例如下:

tcpclient tcpclient = new tcpclient();//建立tcpclient物件例項

try

catch(exception e)

try

catch(exception e)

通過以上方法得到networkstream網路流之後,你就可以使用標準流讀寫方法write和read來傳送和接受資料了。

以上是.net下使用tcpclient類實現客戶端程式設計的技術資料,為了向客戶端提供這些服務,我們還需要編制相應的服務端程式,前一篇《visual c#.net網路程式開發-socket篇》上曾經提到, socket作為其他網路協議的基礎,既可以面向客戶端開發,也可以面向服務端開發,在傳輸層面上使用較多,而在應用協議層面上,客戶端我們採用構建於socket類之上的tcpclient取代socket;相應地,構建於socket之上的tcplistener提

本文**

網路程式設計之TCP程式設計

tcp程式設計中,如果要完成通訊,通訊雙方必須要建立socket,通過socket完成通訊。tcp通訊步驟 1 伺服器啟動serversocket作為通訊的server端,等待客戶端鏈入。2 客戶端建立socket作為通訊的client端 3 client端鏈入server端後建立可靠的 雙向的 持...

網路程式設計之TCP程式設計案例

客戶端 public static void main string args fileinputstream.close outputstream.close catch unknownhostexception e catch ioexception e 伺服器 public static vo...

網路程式設計之TCP應用

客戶端輸入三角形的三條邊長,判斷能否組成三角形,將三條邊傳送到伺服器端,計算三角形面積,返回給客戶端 海 式 a,b,c p a b c 2 area math.sqrt p p a p b p c 1.伺服器端 public class server dataoutputstream dos ne...