2018python全棧視頻-01.課堂筆記01tcp編程_第1頁(yè)
2018python全棧視頻-01.課堂筆記01tcp編程_第2頁(yè)
2018python全棧視頻-01.課堂筆記01tcp編程_第3頁(yè)
2018python全棧視頻-01.課堂筆記01tcp編程_第4頁(yè)
2018python全棧視頻-01.課堂筆記01tcp編程_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

網(wǎng)絡(luò)TCP服務(wù)端編服務(wù)器端編程步make?le練客戶端編程網(wǎng)絡(luò)編Socket套接協(xié)議AF表示AddressFamily,用于socket()第一個(gè)參名含 Socket,windows名含TCPTCPIPv4地址為一個(gè)二元組('IP地址字符串',socket.accept()->(socketobject,addressaccet方法阻塞等待客戶端建立連接,返回一個(gè)新的Sck對(duì)象和客戶端地址的二元組地址是客戶端的地址,Pv中它是一個(gè)二元組(litadr,pot)接收recv(bufsize?ags使用緩沖區(qū)接收數(shù)據(jù)問(wèn)兩次綁定同一個(gè)端口會(huì)怎么樣importimports=socket.socket()#創(chuàng)建sockets.bind(('',9999))#一個(gè)二元ss.listen()#開(kāi) s1,info=s.accept()#阻塞直到和客戶端成功建立連接,返回一個(gè)socket#data=s1.recv(1024)print(data,info) #接s2,_=data=s2.recv(1024) opython')練習(xí)——需求服務(wù)端應(yīng)該對(duì)應(yīng)一個(gè)classclass init(self,ip,port):#啟動(dòng)服self.sock=socket.socket()self.addr=(ip,port)defstart(self):#啟defaccept(self):#多人連接defrecv(self):#接收客戶端數(shù)據(jù)defstop(self):#停止服在此基礎(chǔ)上,擴(kuò)展完importloggingimportsocketimportthreadingimportdatetimelogging.basicConfig(level=logging.INFO,format="%(asctime)s%(thread)dclass init(self,ip='',port=9999):#啟動(dòng)服務(wù)self.sock=self.addr=(ip,port)self.clients客戶端defstart(self):#啟self.sock.bind(self.addr)#綁self.sock.listen()#accept會(huì)阻塞主線程,所以開(kāi)一個(gè)新線程defaccept(self):#多人連接whilesock,client=self.sock.accept()#阻塞self.clients[client]=sock#添加到客戶端字典#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開(kāi)啟新的線程threading.Thread(target=self.recv,args=(sock,defrecv(self,sock:socket.socket,client):#接收客戶端數(shù)據(jù)whiledata=sock.recv(1024)#阻塞到數(shù)據(jù)到來(lái)msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),*client,msg=msg.encode()forsinself.clients.values():defstop(self):#停止服forsinself.clients.values():cs=ChatServer()基本功能完成,但是有問(wèn)題。使用Event改進(jìn)importimportloggingimportsocketimportthreadingimportdatetimelogging.basicConfig(level=logging.INFO,format="%(asctime)s%(thread)dclass init(self,ip='',port=9999):#啟動(dòng)服務(wù)self.sock=socket.socket()self.addr=(ip,port)self.clients={}#客戶端self.event=defstart(self):#啟self.sock.bind(self.addr)#綁self.sock.listen()#accept會(huì)阻塞主線程,所以開(kāi)一個(gè)新線程defaccept(self):#多人連接whilenotsock,client=self.sock.accept()#阻塞self.clients[client]=sock#添加到客戶端字典#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開(kāi)啟新的線程threading.Thread(target=self.recv,args=(sock,defrecv(self,sock:socket.socket,client):#接收客戶端數(shù)據(jù)whilenotdata=sock.recv(1024)#阻塞到數(shù)據(jù)到來(lái)msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),*client,msg=msg.encode()forsinself.clients.values():defstop(self):#停止服forsinself.clients.values():cs=ChatServer()whilecmd=input('>>').strip()ifcmd=='quit':客戶端主動(dòng)斷開(kāi)帶來(lái)的問(wèn)送一個(gè)空消息,超時(shí)返回異常,捕獲異常并清理連接。importloggingimportsocketimportimportloggingimportsocketimportthreadingimportdatetimelogging.basicConfig(level=logging.INFO,format="%(asctime)s%(thread)dclass init(self,ip='',port=9999):#啟動(dòng)服務(wù)self.sock=socket.socket()self.addr=(ip,port)self.clients={}#客戶端self.event=defstart(self):#啟self.sock.bind(self.addr)#綁self.sock.listen()#accept會(huì)阻塞主線程,所以開(kāi)一個(gè)新線程defaccept(self):#多人連接whilenotsock,client=self.sock.accept()#阻塞self.clients[client]=sock#添加到客戶端字典#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開(kāi)啟新的線程threading.Thread(target=self.recv,args=(sock,defrecv(self,sock:socket.socket,client):#接收客戶端數(shù)據(jù)whilenotdata=sock.recv(1024)#阻塞到數(shù)據(jù)到來(lái)msgdata.decode().strip()#客戶端退出命令ifmsg=='quit':('{}quits'.format(client))msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),*client,msgmsg=forsinself.clients.values():defstop(self):#forsinself.clients.values():cs=ChatServer()whilecmd=input('>>').strip()ifcmd=='quit':(threading.enumerate#socket名含socket.recv(bufsize[,socket.recvfrom(bufsize[,獲取數(shù)據(jù),返回一個(gè)二元組(bytes,socket.recv_into(bu?er[,nbytes[,nbytes[,?ags]])獲取數(shù)據(jù),返回一個(gè)二元組 socket.send(bytes[,socket.sendall(bytes[,UDP發(fā)送數(shù)socket.send?le(?le,名含返回連接套接字的地址。返回值通常是元組返回套接字自己的地址。通常是一個(gè)元組設(shè)置套接字操作的超時(shí)期,meout是一個(gè)浮點(diǎn)數(shù),單位是秒。值為Nne表示沒(méi)有超時(shí)期。一般,超時(shí)期應(yīng)該在剛創(chuàng)建套接字時(shí)設(shè)置,因?yàn)樗鼈兛赡苡糜谶B接的操作(如connect())socket.makefile(mode='r',socket.makefile(mode='r',buffering=None,*,encoding=None,errors=None,##使用makefile簡(jiǎn)單例importsockserver=socket.socket()ip=''port=addr=(ip,port)s,_=sockserver.accept()f=line=f.read(10)#阻塞f.write('Returnyourmsg:{}'.format(line))上例不能循環(huán)接收消息,修改一importimportsocketimportthreadingsockserver=ipip=port=addr=(ip,port)event=defaccept(sock:socket.socket,e:threading.Event):s,_=sock.accept()f=whileline=f.readline()ifline.strip()=="quit":#注意要發(fā)quit\nf.write('Returnyourmsg:{}'.format(line))t=threading.Thread(target=accept,args=(sockserver,event))make?le使用make?le改寫(xiě)群聊importimportloggingimportsocketimportthreadingimportdatetimelogging.basicConfig(level=logging.INFO,format="%(asctime)s%(thread)dclassdefinit(self,ip='',port=9999):#啟動(dòng)服務(wù)self.sock=self.addr=(ip,port)self.clients={}#客戶端self.event=threading.Event()defstart(self):#啟self.sock.bind(self.addr)#綁self.sock.listen()#accept會(huì)阻塞主線程,所以開(kāi)一個(gè)新線程defaccept(self):#多人連接whilenotsock,client=self.sock.accept()#阻塞#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開(kāi)啟新的線程f=sock.makefile('rw')#支持讀寫(xiě)self.clients[client]=f#添加到客戶端字典threading.Thread(target=self.recv,args=(f,client),defrecv(self,f,client):#接收客戶端數(shù)據(jù)whilenotdata=f.readline()#阻塞到換行符msgdata.strip()#客戶端退出命令ifmsg=='quit':('{}quits'.format(client))msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),forsinself.clients.values():defstop(self):#停止服forsinself.clients.values():cs=ChatServer()whilecmd=input('>>').strip()ifcmd=='quit':(threading.enumerate(用來(lái)觀察斷開(kāi)后線程的變ChatServer實(shí)驗(yàn)用完整代注意,這個(gè)代碼為實(shí)驗(yàn)用,代碼中瑕疵還有很多。Sockt太底層了,實(shí)際開(kāi)發(fā)中很少使用這么底層的接口。增加一些異常處理。importloggingimportsocketimportthreadingimportdatetimelogging.basicConfig(level=logging.INFO,format="%(asctime)s%(thread)dclass init(self,ip='',port=9999):#啟動(dòng)服務(wù)self.sock=socket.socket()self.addr=(ip,port)self.clients={}#客戶端self.event=defstart(self):#啟self.sock.bind(self.addr)#綁self.sock.listen()#accept會(huì)阻塞主線程,所以開(kāi)一個(gè)新線程defaccept(self):#多人連接whilenotsock,client=self.sock.accept()#阻塞#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開(kāi)啟新的線程f=sock.makefile('rw')#支持讀寫(xiě)self.clients[client]=f#添加到客戶端字典threading.Thread(target=self.recv,args=(f,client),defrecv(self,f,client):#接收客戶端數(shù)據(jù)whilenotself.event.is_set():

data=f.readline()#阻塞到換行符exceptExceptionase:logging.error(e)#有任何異常,退出data='quit'msgdata.strip()#客戶端退出命令ifmsg=='quit':('{}quits'.format(client))msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),*client,forsinself.clients.values():defstop(self):#forsinself.clients.values():defcs=ChatServer()whilecmd=input('>>').strip()ifcmd=='quit':(threading.enumerate#ifname=='main':TCP連接到遠(yuǎn)端服務(wù)端的ip和ot,conec()方法傳輸數(shù)據(jù)importimportclient=socket.socket()ipaddr=('',9999)client.connect(ipaddr)#直接連data=client.recv(1024)#阻塞等待開(kāi)始編寫(xiě)客戶端importsocketimportthreadingimportdatetimei

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論