【转】TcpListener和tcpclient使用
前段時(shí)間公司項(xiàng)目中遇著需要做文件的遠(yuǎn)程傳輸,場(chǎng)景是用戶(hù)通過(guò)網(wǎng)頁(yè)選擇一些文件,然后提交請(qǐng)求到服務(wù)器,同時(shí)把請(qǐng)求標(biāo)識(shí)傳遞給本機(jī)的TCP文件傳輸端;服務(wù)器收到請(qǐng)求后在服務(wù)器端創(chuàng)建任務(wù)生成保存文件的路徑同時(shí)通知文件傳輸端開(kāi)始傳文件到服務(wù)器,當(dāng)時(shí)是同事用C++寫(xiě)的傳輸端,于是便想何不用NET來(lái)實(shí)現(xiàn)呢,本來(lái)服務(wù)端的大部分程序和客戶(hù)端程序都是用NET寫(xiě)的,于是便有了這篇文章。小生一直是做web開(kāi)發(fā)的,對(duì)WinForm技術(shù)不勝熟悉,如有不妥還請(qǐng)拍磚。
在NET框架下可以方便的使用tcplistener和tcpclient兩個(gè)類(lèi)來(lái)實(shí)現(xiàn)tcp編程,而無(wú)需直接操作socket,這也是這兩個(gè)類(lèi)方便的地方。對(duì)于tcplistener可以理解是用在服務(wù)端的,僅需要設(shè)置一個(gè)監(jiān)聽(tīng)端口即可,如
var listener = new TcpListener(9000);//監(jiān)聽(tīng)9000端口
然后調(diào)用 Start方法開(kāi)始監(jiān)聽(tīng):
?listener.Start(10);//掛起隊(duì)列最大長(zhǎng)度10個(gè)
再然后就是等待客戶(hù)端的接入了,通常可以用一個(gè)無(wú)限循環(huán)來(lái)接受不斷請(qǐng)求的客戶(hù)端
while (true)
?{
??????? if (listener.Pending())//異步接受一個(gè)請(qǐng)求
?????? {
?????????var client=??listener.AcceptTcpClient();
//現(xiàn)在就可以使用client,愛(ài)干嘛干嘛吧
?????? }
}
在這里,為了實(shí)現(xiàn)多個(gè)客戶(hù)端同時(shí)訪問(wèn)通常會(huì)使用異步的BeginAcceptTcpClient來(lái)接受客戶(hù)端請(qǐng)求
有了client,通過(guò)GetStream方法就得到當(dāng)前的網(wǎng)絡(luò)流,使用Write,Read方法即可進(jìn)行數(shù)據(jù)寫(xiě)入和讀取。
對(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ù)端是開(kāi)啟的,這樣就能連接上了。
下一步就是讀取或者發(fā)送數(shù)據(jù)到服務(wù)端了,同樣可以使用GetStream方法獲取到網(wǎng)絡(luò)流,使用Write,Read方法即可進(jìn)行數(shù)據(jù)寫(xiě)入和讀取。
這些操作都是基于流進(jìn)行的,因此數(shù)據(jù)本身不具有結(jié)構(gòu),比如對(duì)于一個(gè)操作,服務(wù)端需要知道操作名和操作數(shù)據(jù),這兩個(gè)東西放在流里一起發(fā)送過(guò)去沒(méi)有人會(huì)認(rèn)識(shí),這就要求服務(wù)端和客戶(hù)端在傳遞數(shù)據(jù)的時(shí)候遵循一致的數(shù)據(jù)結(jié)構(gòu),比如使用這樣的 method:getname#parms:ky?
現(xiàn)在介紹下本篇附帶的實(shí)例:
在服務(wù)端啟動(dòng)的時(shí)候會(huì)要求用戶(hù)輸入一個(gè)共享的文件夾路徑,然后啟動(dòng)服務(wù),這個(gè)服務(wù)會(huì)提供給客戶(hù)端這個(gè)文件夾下的圖片文件列表,同時(shí)也可以讓客戶(hù)端下載圖片;
客戶(hù)端啟動(dòng)時(shí)要求用戶(hù)輸入一個(gè)服務(wù)端的地址,然后點(diǎn)擊getfilelist來(lái)獲取遠(yuǎn)程文件夾的文件列表,然后選擇一個(gè)文件即可下載這個(gè)文件到本地。
部分截圖:
服務(wù)端
客戶(hù)端
源文件下載
總結(jié)
以上是生活随笔為你收集整理的【转】TcpListener和tcpclient使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 酷派COOL 20s 5G怎么样?千元档
- 下一篇: Hyper-V第1代虚拟机和第2代虚拟机