【转】TcpListener和tcpclient使用
前段時(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酷派COOL 20s 5G怎么样?千元档
- 下一篇: Hyper-V第1代虚拟机和第2代虚拟机