




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
網(wǎng)絡(luò)編程實(shí)驗(yàn)報(bào)告python_socket網(wǎng)絡(luò)編程一、TCP編程〔一〕、建立一個(gè)TCP服務(wù)器連接需要6個(gè)步驟:創(chuàng)建socket對(duì)象。調(diào)用socket構(gòu)造函數(shù):socket=socket.socket(familly,type)family的值可以是AF_UNIX(Unix域,用于同一臺(tái)機(jī)器上的進(jìn)程間通訊),也可以是AF_INET[對(duì)于IPV4協(xié)議的TCP和UDP〕,至于type參數(shù),SOCK_STREAM〔流套接字〕或者SOCK_DGRAM〔數(shù)據(jù)報(bào)文套接字〕,SOCK_RAW〔raw套接字〕。將socket綁定〔指派〕到指定地址上,socket.bind(address)address必須是一個(gè)雙元素元組,((host,port)),主機(jī)名或者ip地址+端口號(hào)。如果端口號(hào)正在被使用或者保留,或者主機(jī)名或ip地址錯(cuò)誤,則引發(fā)socke.error異常。綁定后,必須準(zhǔn)備好套接字,以便接受連接請(qǐng)求。socket.listen(backlog)backlog指定了最多連接數(shù),至少為1,接到連接請(qǐng)求后,這些請(qǐng)求必須排隊(duì),如果隊(duì)列已滿,則拒絕請(qǐng)求。服務(wù)器套接字通過(guò)socket的accept方法等待客戶請(qǐng)求一個(gè)連接:connection,address=socket.accept()調(diào)用accept方法時(shí),socket會(huì)進(jìn)入仙2讓遮'〔或阻塞〕狀態(tài)。客戶請(qǐng)求連接時(shí),方法建立連接并返回服務(wù)器。accept方法返回一個(gè)含有倆個(gè)元素的元組,形如(connection,address)。第一個(gè)元素〔connection〕是新的socket對(duì)象,服務(wù)器通過(guò)它與客戶通信;第二個(gè)元素〔address〕是客戶的internet地址。處理階段,服務(wù)器和客戶通過(guò)send和recv方法通信〔傳輸數(shù)據(jù)〕。服務(wù)器調(diào)用send,并采用字符串形式向客戶發(fā)送信息。send方法返回已發(fā)送的字符個(gè)數(shù)。服務(wù)器使用recv方法從客戶接受信息。調(diào)用recv時(shí),必須指定一個(gè)整數(shù)來(lái)控制本次調(diào)用所接受的最大數(shù)據(jù)量。recv方法在接受數(shù)據(jù)時(shí)會(huì)進(jìn)入'blocket'狀態(tài),最后返回一個(gè)字符串,用它來(lái)表示收到的數(shù)據(jù)。如果發(fā)送的量超過(guò)recv所允許,數(shù)據(jù)會(huì)被截?cái)唷6嘤嗟臄?shù)據(jù)將緩沖于接受端。以后調(diào)用recv時(shí),多余的數(shù)據(jù)會(huì)從緩沖區(qū)刪除。傳輸結(jié)束,服務(wù)器調(diào)用socket的close方法以關(guān)閉連接。[二)、建立一個(gè)TCP客戶端連接則需要4個(gè)步驟:創(chuàng)建一個(gè)socket以連接服務(wù)器socket=socket.socket(family,type)使用socket的connect方法連接服務(wù)器socket.connect((host,port))客戶和服務(wù)器通過(guò)send和recv方法通信。結(jié)束后,客戶通過(guò)調(diào)用socket的close方法來(lái)關(guān)閉連接。二,建立TCP連接首先建立服務(wù)器程序。器socketsen!.py-E:\5Xf4\pyihon\ccide\socketserwpy II前|1WFileEditFormatRunOptionsWindowsH&lpIfromjoctetimport&IfromtineimportctinieHOST=B1PORT=21567IEUFSLZ=1024ADDR=(HOSTrFORT)tcpSerSock=socketItcp5er5ock.bmi|addrj-tcpSerSock.liscen{5}wnileTrue:print(1waitingforconnaetion....1}|tcpCliSock,addz—tcpSeiSack-accept()print(1?..connectedEiqm:1.addr)True:data=tcpCliSock.recvIBJFSIZ)ifnotdarta:trssKprint('Receivedfromclient:1rdaca.decode( ))tqpCHSQck.^end(data)tcpCliSack.close(|tcpSer-Snek.close(}創(chuàng)建套接字,綁定套接字,開(kāi)始監(jiān)聽(tīng),就是一個(gè)while循環(huán)一直監(jiān)聽(tīng)有沒(méi)有消息連接??蛻舳顺绦?/p>
制&ocket_di..py-£;1軟件\0)玨口門而口6}\看口[上&_匚11因FileEditFormatRunOptiDnsWindowsH&lp|froinjacketimport*HOST=FrlocalhQBtr,POO=215€7EJFSIZ=1024ADDE-(HOSTrECRT}tcpCliSoek=socket(AF_TWTFSDCF_STREjLM>LcpCliSocfc.cormecL(ADDR)whileTriie:data=input('>4>ifnotdata:treattcrCliSock.aend(data.encode('utf-8'}Idata=tcpCliSock■zecv(SUFSIZ\ifnotdata:breakprint(data.dcc-adc(1utf-8,)}tcpCliSock.clcse()創(chuàng)建套接字,連接,等待輸入,發(fā)送。i-i回E37^"PythonShell”7A^PythonShdl*同一臺(tái)電腦結(jié)果在兩個(gè)shell中演示。i-i回E37^"PythonShell”7A^PythonShdl*FileEditShellD&bugOptionsWindowsHelpPython3.2.2(default,Sep42011f09:51:DS}[NSCv-1LSD032k>it(Intel}]onwin32Type"ciopyriDht:''1'.rpcreditsfforFTliceTise(}nfornuoreinfoTmaition.?>>hell□wozld'helloworld]>nihaa:niliao>4I局域網(wǎng)內(nèi)交互測(cè)試信息:作為服務(wù)器,來(lái)自IP地址為:192.168.1.101客戶端的消息。
TypeFcopyrightnf^credi-tB^orFrlicense()forniDTeinforniiation■>?=============================RE5TARI=================?>,waitingfor-com^eetion..--..-cx>3in=ctedfxoni:(|comseekerLnporE片fromtimeiznpcrtctiiteHOST=|comseekerLnporE片fromtimeiznpcrtctiiteHOST=11PORT=21568BJF5IZ;=102^ADDR=(HOSTrFORT)iadpSerSack=socket(JiF_II:?:TfSOCB^SGRAM)udpSerSock.bind£ADDR}wAileTrue:princ('waitingfarmessageda.ta,aiddr-udpSerSqck.zecvfram(BUFSIE)lodpSarSoek.send.tc(dataraddr}print(1,..receivedfromandreturnedto:1raddr}udpSerSoc-k.clcse()Receive:!rramclj.ent:HelloHxiaoznao2Receivedfraruclient:Hoedievou?三,建立UDP連接UDP的建立過(guò)程基本和TCP一樣,看以下代碼異同,這里不在熬述。建立服務(wù)器程序我udoserv.oy-E han\code\udpseri/,pyFileEditFormatRunOptionsWindowsHelp創(chuàng)建套接字,開(kāi)始監(jiān)聽(tīng),就是一個(gè)while循環(huán)一直監(jiān)聽(tīng)有沒(méi)有消息連接。隼立客戶端程序 ,? _*_d|zcl.py-z:i架件:p/710n\code\ucpc'.py .一三|■一,F(xiàn)ileEditFormatRunOptionsWindowsHelpIfromsocketimportHCST=1localhnst'ECR7=2:56EBUFSIZ=1024IlEDR=(HCSTpPORT}udpCliSoek=socket(AF_riTETFSOCK_DGRAN}whileTrue:data=input[■》,jifnotdata:break .udpCHSock.sendto(data.encodeJ■utf-fi"}rElDDR)data.ADDE^.=ucipZliSoek.recvfrem(BUF5I2)ifnotdata:hireakprint(data,decode(1utf-fi1}r'from1rADDR)udpClISocJr.close|> ?創(chuàng)建套接字,while循環(huán)一直監(jiān)聽(tīng)有沒(méi)有消息連接。兩個(gè)shell中演示顯示數(shù)據(jù)傳送逑叩7逑叩7the1rl空I*7A"PythonShell* 亙fileEditShellDebugOptionsWindowsHdpPython3.2-2(defaultySep42D11,09:51s09J[MSCva150032bit(Intel}]anwinjd32Typencopyriaiitnr1rlic工己dlls1511Tor^license(}rrforMoreinforiDiation.?>女觸手例好±rDi7.(R1217.0.C.1\2156-°))HR超MR較from(11:7.0.0.11,215£5)局域網(wǎng)內(nèi)的信息交互:作為服務(wù)器,來(lái)自IP地址為192.168.1.101的消息。(7?*PythonShetP n回__5FileEditShellDebugOptionsWindowsHelpFymon3.2.2(deiault:,Sep42011,a?:51:□£}JM5Cv.150032jdie(intel}]onwm32TypeITcciryricjht,rT,01credits"□二^license()FFformoreinfomatian.================================restart========================,========>>>waitinglorrrsessage.....?receivedfromanareturnedto:(1192.168.1.1011f3299)b'Thisisallentir.essage1waitinaformesssae--.作為客戶端,向IP地址為192.168.1.101的服務(wù)器發(fā)送消息。%*PythonShell*File^dit£he[lDebugOptionsWindowsHelpPythcn3.2.2(default,Sep42011f09:51:08}[MSCv.150032tic(Intel}]onwin432T3p三^ccpyrightfffcredits'111ornlicense()"Ecxmoreiziformaticn.?>================================RESTART================================?>>xiIUDbora¥ouxdatawas11bytesfztomf1192.160.1.1Q11f9000)>jtigeYourdatawas5bytesfrem(1192.168.1.1311r8D00|A總結(jié):一般的TCP和UDP連接服務(wù)器和客戶端的內(nèi)容和步驟。TCP服務(wù)器端:1創(chuàng)建套接字,綁定套接字到當(dāng)?shù)氐刂罚缓箝_(kāi)始監(jiān)聽(tīng)連接。就是socket,bind,listen。2進(jìn)入循環(huán),不斷接受客戶端的連接請(qǐng)求,然后接收傳來(lái)的數(shù)據(jù),當(dāng)然也可以發(fā)送給對(duì)方數(shù)據(jù)。就是accept一個(gè)連接,然后recv數(shù)據(jù)。3接收完畢可以關(guān)閉套接字,close。這個(gè)過(guò)程的偽代碼如下:ss=socket() #創(chuàng)建服務(wù)器套接字ss.bind() #把本地地址綁到套接字上ss.listen() #監(jiān)聽(tīng)連接inf_loop: #服務(wù)器無(wú)限循環(huán)cs=ss.accept() #接受客戶端的連接comm._loop: #通信循環(huán)cs.recv()/cs.send()#對(duì)話cs.close() #關(guān)閉客戶套接字ss.close() #關(guān)閉服務(wù)器套接字TCP客戶端:1創(chuàng)建套接字,然后連接遠(yuǎn)端地址,socket,connecto2建立連接之后開(kāi)始發(fā)送數(shù)據(jù)。Send〔data〕,當(dāng)然可以從緩沖區(qū)讀取服務(wù)器發(fā)來(lái)的數(shù)據(jù)。Recv〔BUFF〕3完畢后,關(guān)閉套接字。Close偽代碼如下:cs=socket() #創(chuàng)建客戶套接字cs.connect() #嘗試連接服務(wù)器comm._loop: #通信循環(huán)cs.send()/cs.recv()#對(duì)話cs.close() #關(guān)閉套接字UDP服務(wù)器端:1創(chuàng)建套接字,并綁定到當(dāng)?shù)氐刂穝ocket,bing2直接接收數(shù)據(jù)從bufferoRecvfrom〔〕,這個(gè)函數(shù)接受到數(shù)據(jù),和sender的地址〔主機(jī)號(hào),端口號(hào)〕,當(dāng)然也可以發(fā)送數(shù)據(jù)到客戶端,用sendto〔data,addr〕3關(guān)閉套接字close〔〕偽代碼:Ss=socket() #創(chuàng)建套接字ss.bind() #綁定inf_loop: #無(wú)限循環(huán)ss.recvfrom()/sendto()#對(duì)話ss.close() #關(guān)閉套接字UDP客戶端:1創(chuàng)建套接字,socket2進(jìn)入循環(huán),發(fā)送接收數(shù)據(jù)sendto,recvfrom3關(guān)閉套接字close〔〕偽代碼:Cs=socket() #創(chuàng)建Comm_loop: #循環(huán)接收發(fā)送Cs.sendto()/recvfrom()#對(duì)話Cs.close() #關(guān)閉Send〔〕sendto〔〕recv〔〕recvfrom〔〕我們發(fā)現(xiàn)在TCP連接中我們發(fā)生接收數(shù)據(jù)都是用的send〔〕和recv〔〕方法,而在UDP中用的sendto〔〕和recvfrom〔〕。這兩對(duì)方法實(shí)現(xiàn)的作用差不多,但是參數(shù)有所不同,TCP中,send〔data〕和recv〔buffer〕,因?yàn)樵赥CP中,傳輸數(shù)據(jù)之前連接已經(jīng)建立,也就是說(shuō)我們知道給誰(shuí)發(fā),或者收誰(shuí)的數(shù)據(jù)。而在UDP中用,recvfrom〔buffer〕和sendto〔data,addr〕,recvfrom可以接受到sender的addr,然后發(fā)送時(shí),根據(jù)addr發(fā)送。因?yàn)閁DP不是面向連接的,所以我們必須知道這個(gè)數(shù)據(jù)要發(fā)給誰(shuí),它的地址什么。四,UDP廣播1,工作原理在UDP廣播通訊模式下,一個(gè)單獨(dú)的數(shù)據(jù)包拷貝發(fā)送給網(wǎng)絡(luò)上所有主機(jī)。當(dāng)不能明確具體的服務(wù)器,而又要求該服務(wù)時(shí),UDP廣播提供了傳輸不區(qū)分種類的消息的便捷方式。在多數(shù)情況下UDP廣播僅僅作為本地網(wǎng)絡(luò)通信形式。受限的廣播地址是255.255.255.255。該地址用于主機(jī)配置過(guò)程中IP數(shù)據(jù)報(bào)的目的地址,此時(shí),主機(jī)可能還不知道它所在網(wǎng)絡(luò)的網(wǎng)絡(luò)掩碼,甚至連它的IP地址也不知道。在任何情況下,路由器都不轉(zhuǎn)發(fā)目的地址為受限廣播地址的數(shù)據(jù)報(bào),這樣的數(shù)據(jù)報(bào)僅出現(xiàn)在本地網(wǎng)絡(luò)中。已知網(wǎng)絡(luò)主機(jī)的IP地址和子網(wǎng)掩碼,可以算得指向主機(jī)所在子網(wǎng)的廣播。子網(wǎng)廣播地址=〔主機(jī)IP〕“或”〔子網(wǎng)掩碼取反〕。2,拓?fù)浣Y(jié)構(gòu)
Help寵udpgbcli.py- W\pythDn\code\Ldpgbcli.pyHelpFileEditFormatRunOptionsWindowsimportsockets=soeket.seeker(3ociet?AF_IKETtsocket.SDCK_DGRAI<}s.setsockopt(socket.SOL_SOCKETpsocket.SD_BROADCASTp1)FORT=106Q|a.tindf('1,F2xT)卜F^int(1ListeningforJoroadcastsat1f3.getsocknaite()}T-:hileTrue:data.faddress=s?recv±roia(65535)priiLE('Serverreceivedtrail:^s(address,dara.decode('utr-e1)}}■PythonShellFileEditShellDebugOptionsWindowsHelpPython3.2.2(defaultrSep42Dllr09:51:08)[MSCv.150032bit(Incel)]onwin32Type"ccip^rigliG*^1,1eredies"or"license(}"XormoreInroiittaLlon.>?RESTART>?>>>A7^"PythonSheirFileEditShellDebugOptionsWindowsHelpPython3.2.2(defaulcrSep42011r09:51:08|[MSCv.150032bit(Intel|i]onwinA||32Typu"capyzightnfncredit5,,T□£"license()wfarlunxeinfcrmsXxaiL.?>=======二=二=二====================R£START=======
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 31鐵及其化合物 教學(xué)設(shè)計(jì) 2023-2024學(xué)年高一上學(xué)期化學(xué)人教版(2019)必修第一冊(cè)
- 山西省煤礦井下廣播系統(tǒng)使用與管理規(guī)范標(biāo)準(zhǔn)
- 二零二五年度研究生考試培訓(xùn)服務(wù)協(xié)議范本
- 2025年度演員參演電視劇武術(shù)指導(dǎo)合同
- 二零二五年度住宅小區(qū)車位使用權(quán)續(xù)租協(xié)議書(shū)
- 2025年度科技項(xiàng)目研發(fā)借款合同起訴狀
- 二零二五年度婚前財(cái)產(chǎn)協(xié)議:婚前財(cái)產(chǎn)分割與婚后財(cái)產(chǎn)權(quán)益保障協(xié)議
- 二零二五年度方式卡租賃與移動(dòng)營(yíng)銷解決方案合同
- 二零二五年度渠道業(yè)務(wù)員勞動(dòng)合同(區(qū)域合作伙伴合作)
- 2025年度智能穿戴設(shè)備股東入股合作合同
- 小學(xué)五年級(jí)下冊(cè)外研版英語(yǔ):Module 5 模塊測(cè)試
- 諾如病毒課件教學(xué)課件
- 《城市軌道交通應(yīng)急處理》課件-《城市軌道交通應(yīng)急處理》項(xiàng)目四
- 臨建工程勞務(wù)承包條件
- 2024年山東省青島市中考道德與法治試題卷(含答案及解析)
- GB/T 44561-2024石油天然氣工業(yè)常規(guī)陸上接收站液化天然氣裝卸臂的設(shè)計(jì)與測(cè)試
- 員工履歷表(標(biāo)準(zhǔn)樣本)
- 薪酬管理制度、員工薪資結(jié)構(gòu)規(guī)定、薪酬福利管理制度
- 2024-2030年中國(guó)實(shí)驗(yàn)室自動(dòng)行業(yè)市場(chǎng)發(fā)展分析及投資發(fā)展戰(zhàn)略研究報(bào)告
- 睪丸扭轉(zhuǎn)的護(hù)理課件
- 小兒(兒童)常見(jiàn)皮疹理論考核試題
評(píng)論
0/150
提交評(píng)論