日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【转】TcpListener和tcpclient使用

發(fā)布時(shí)間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】TcpListener和tcpclient使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前段時(shí)間公司項(xiàng)目中遇著需要做文件的遠(yuǎn)程傳輸,場(chǎng)景是用戶通過網(wǎng)頁(yè)選擇一些文件,然后提交請(qǐng)求到服務(wù)器,同時(shí)把請(qǐng)求標(biāo)識(shí)傳遞給本機(jī)的TCP文件傳輸端;服務(wù)器收到請(qǐng)求后在服務(wù)器端創(chuàng)建任務(wù)生成保存文件的路徑同時(shí)通知文件傳輸端開始傳文件到服務(wù)器,當(dāng)時(shí)是同事用C++寫的傳輸端,于是便想何不用NET來(lái)實(shí)現(xiàn)呢,本來(lái)服務(wù)端的大部分程序和客戶端程序都是用NET寫的,于是便有了這篇文章。小生一直是做web開發(fā)的,對(duì)WinForm技術(shù)不勝熟悉,如有不妥還請(qǐng)拍磚。

在NET框架下可以方便的使用tcplistener和tcpclient兩個(gè)類來(lái)實(shí)現(xiàn)tcp編程,而無(wú)需直接操作socket,這也是這兩個(gè)類方便的地方。對(duì)于tcplistener可以理解是用在服務(wù)端的,僅需要設(shè)置一個(gè)監(jiān)聽端口即可,如

var listener = new TcpListener(9000);//監(jiān)聽9000端口

然后調(diào)用 Start方法開始監(jiān)聽:

?listener.Start(10);//掛起隊(duì)列最大長(zhǎng)度10個(gè)

再然后就是等待客戶端的接入了,通常可以用一個(gè)無(wú)限循環(huán)來(lái)接受不斷請(qǐng)求的客戶端

while (true)
?{
??????? if (listener.Pending())//異步接受一個(gè)請(qǐng)求

?????? {
?????????var client=??listener.AcceptTcpClient();

   //現(xiàn)在就可以使用client,愛干嘛干嘛吧

?????? }
}

在這里,為了實(shí)現(xiàn)多個(gè)客戶端同時(shí)訪問通常會(huì)使用異步的BeginAcceptTcpClient來(lái)接受客戶端請(qǐng)求

有了client,通過GetStream方法就得到當(dāng)前的網(wǎng)絡(luò)流,使用Write,Read方法即可進(jìn)行數(shù)據(jù)寫入和讀取。

對(duì)于tcpclient,使用的時(shí)候您需要告訴他去連接哪臺(tái)計(jì)算機(jī)的哪個(gè)端口(使用Endpoint來(lái)表示),然后調(diào)用Connect方法,就像下面這樣

var? _endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9000);
var client = new TcpClient();
client.Connect(_endPoint);

如果服務(wù)端是開啟的,這樣就能連接上了。

下一步就是讀取或者發(fā)送數(shù)據(jù)到服務(wù)端了,同樣可以使用GetStream方法獲取到網(wǎng)絡(luò)流,使用Write,Read方法即可進(jìn)行數(shù)據(jù)寫入和讀取。

這些操作都是基于流進(jìn)行的,因此數(shù)據(jù)本身不具有結(jié)構(gòu),比如對(duì)于一個(gè)操作,服務(wù)端需要知道操作名和操作數(shù)據(jù),這兩個(gè)東西放在流里一起發(fā)送過去沒有人會(huì)認(rèn)識(shí),這就要求服務(wù)端和客戶端在傳遞數(shù)據(jù)的時(shí)候遵循一致的數(shù)據(jù)結(jié)構(gòu),比如使用這樣的 method:getname#parms:ky?

現(xiàn)在介紹下本篇附帶的實(shí)例:

在服務(wù)端啟動(dòng)的時(shí)候會(huì)要求用戶輸入一個(gè)共享的文件夾路徑,然后啟動(dòng)服務(wù),這個(gè)服務(wù)會(huì)提供給客戶端這個(gè)文件夾下的圖片文件列表,同時(shí)也可以讓客戶端下載圖片;

客戶端啟動(dòng)時(shí)要求用戶輸入一個(gè)服務(wù)端的地址,然后點(diǎn)擊getfilelist來(lái)獲取遠(yuǎn)程文件夾的文件列表,然后選擇一個(gè)文件即可下載這個(gè)文件到本地。

部分截圖:

服務(wù)端

客戶端

源文件下載

總結(jié)

以上是生活随笔為你收集整理的【转】TcpListener和tcpclient使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。