




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025年中國短視頻行業(yè)投資潛力分析及行業(yè)發(fā)展趨勢報告
- 2025年五金塑膠電子零配件項目可行性研究報告
- 天然礦泉水項目可行性報告(投資建議模板參考)
- 競技比賽用品行業(yè)市場深度研究及投資戰(zhàn)略規(guī)劃建議報告
- 農(nóng)田管網(wǎng)合同范本
- 年產(chǎn)1萬噸汽車用高端精密彈簧線材新建項目可行性研究報告模板
- 2025年預(yù)伴沙漿項目投資可行性研究分析報告
- 混凝土來料合同范本
- 2025年甲·辛·氰乳油項目投資可行性研究分析報告
- 2025年中國稀土永磁電機(jī)行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略研究報告
- 馬工程西方經(jīng)濟(jì)學(xué)(第二版)教學(xué)課件-1
- 影視劇項目贊助合同協(xié)議書范本
- 采購需求管理課件
- 結(jié)構(gòu)化面試(教師)
- PDCA項目降低非計劃性拔管發(fā)生率持續(xù)改進(jìn)
- 質(zhì)量問題檢出獎勵申請表模板
- 組織行為學(xué)13-組織文化
- 預(yù)應(yīng)力工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 旅游資源規(guī)劃與開發(fā)實(shí)訓(xùn)指導(dǎo)書
- 立體幾何專題:距離和角
- DBJ-T01-43-2003_(北京)通用家庭居室裝飾工程質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
評論
0/150
提交評論