2018python全棧爬蟲高端自動化課程大綱01.課堂筆記01tcp編程_第1頁
2018python全棧爬蟲高端自動化課程大綱01.課堂筆記01tcp編程_第2頁
2018python全棧爬蟲高端自動化課程大綱01.課堂筆記01tcp編程_第3頁
2018python全棧爬蟲高端自動化課程大綱01.課堂筆記01tcp編程_第4頁
2018python全棧爬蟲高端自動化課程大綱01.課堂筆記01tcp編程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

data=f.readline()#阻塞到換行符exceptExceptionase:logging.error(e)#有任何異常,退出data='quit'msgdata.strip()#客戶端退出命令ifmsg== ('{}quits'.format( msg="{:%Y/%m/%d%H:%M:%S}{}:{}\n{}\n".format(datetime.datetime.now(),* forsinself. (threading.enumerate#TCP連接到遠(yuǎn)端服務(wù)端的ip和ot,conec()方法傳輸數(shù)據(jù)..connect(ipaddr)#直接連開始編寫客戶端importsocketimportthreadingimportdatetimeimportloggingFORMAT="%(asctime)s%(threadName)s%(thread)d%(message)s"logging.basicConfig(format=FORMAT,level=logging.INFO)class init(self,ip='',port=9999):self.sock=socket.socket()self.addr=(ip,port)self.event=threading.Event()defstart(self):#啟動對遠(yuǎn)端服務(wù)器的連self.send("I'mready.")#準(zhǔn)備接收數(shù)據(jù),recv是阻塞的,開啟threading.Thread(target=self.recv,defrecv(self):#接收客戶端的數(shù)據(jù)whilenotself.event.is_set():data=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論