tcp port numbers reused出现原因_python socket(tcp 线程)实现简单聊天室
生活随笔
收集整理的這篇文章主要介紹了
tcp port numbers reused出现原因_python socket(tcp 线程)实现简单聊天室
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、原理說明
框架代碼說明:
#python通過線程和socket 最簡單的方式實現TCP聊天功能import socketimport threadingip='127.0.0.1'port=7777s=socket.socket()#生成socket對象s.bind((ip, port))s.listen()def accp(): while True: newsock, clients = s.accept() ''' 執行到accept 方法處于阻塞狀態 該方法生成 一個新的socket(保存在newsock) ,通過新socket 與客戶端建立連接。 通過死循環,當執行到該處代碼,程序阻塞,當TCP客戶端發起tcp連接請求 ,程序執行到下面,并打印newsock 同時生成一個線程對象,調用recv 方法,(到此accp 第一次循環執行完畢,緊接著執行下一次循環并再此生成一個 新socke 等待其他客戶端發過來的TCP連接) ,socket 的recv方法也是阻塞狀態,該方法等待接收客戶端發過來的數據 ,bytes類型 當 收到客戶端發送的數據,recv函數的程序繼續往下執行,打印data ,同時打印newsock的,打印這里只是為了驗證 這里的socket和 accp函數里面第一次生成的socket是同一個對象,此時該函數執行完畢,同時進入下一次循環,執行到sock recv函數 的時候仍出于阻塞狀態,直到TCP客戶端發送信的數據過來。通過該方式 簡單實現聊天的最初級版本功能 ''' print(newsock) threading.Thread(target=recv,args=(newsock,),name="recv").start()def recv(newsock): while True: data = newsock.recv(1024)#阻塞狀態, print(data) print(newsock)accp()版本二:
#TCP 的server端簡單示例import socketimport threadingimport datetimeimport loggingformat="%(asctime)s-----%(process)s----%(thread)s-----%(threadName)s--日志消息--%(message)s "logging.basicConfig(format=format,level=logging.NOTSET)class ChatServer: def __init__(self,ip='127.0.0.1',port=9999): self.sock=socket.socket() self.addr=ip,port self.event = threading.Event() self.newsocks={}#保存 newsocket 和tcp客戶端連接信息。后面通過循環close socket self.lock=threading.Lock() def start(self): self.sock.bind(self.addr) self.sock.listen() threading.Thread(target=self.accept).start() def accept(self): while not self.event.is_set():#當event 是false執行 newsocket,clientinfo=self.sock.accept() with self.lock: self.newsocks[clientinfo]=newsocket threading.Thread(target=self.recv,args=(newsocket,clientinfo),name="recv").start() def recv(self,newsocket,clientinfo): while not self.event.is_set(): try: data=newsocket.recv(1024) except: data=b'' print(data) if data.strip()==b'quit' or data.strip()==b'':#tcp客戶端 軟件如果直接點擊斷開 會生成一個空byets 這里防止出現異常 with self.lock: self.newsocks.pop(clientinfo) newsocket.close() break msg="{:%Y-%m-%d %H:%M:%S}[{}--{}-{}]".format(datetime.datetime.now(), *clientinfo,data.decode()) with self.lock: for s in self.newsocks.values(): s.send(msg.encode())## 將str類型轉成bytes 網絡中傳輸的都是bytes類型 ##data.decode()將受到的bytes類型轉換成字符串 def stop(self): self.event.set() keys=[] with self.lock: keys=list(self.newsocks.values()) self.newsocks.clear() for soc in keys: soc.close() self.sock.close()cs = ChatServer()cs.start()while True: cmd=input(">>").strip() if cmd=="q": cs.stop() break logging.info(threading.enumerate())該程序還有bug 就是newsocket.recv(1024) 處可能會因為網絡原因產生異常 可以通過 try except 處理。可以繼續優化備注 這里TCP 客戶端是通過 tcp/udp調試工具模擬總結
以上是生活随笔為你收集整理的tcp port numbers reused出现原因_python socket(tcp 线程)实现简单聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动端调用百度地图api_百度智能云图像
- 下一篇: 系统检测到您正在使用网页抓取工具_【安全