Python之路 - Socket實現QQ聊天


介紹 🍀

在上一篇中寫了最基本版的socket服務端和客戶端 , 即僅能通信一次后就自動關閉了 , 顯然實際應用中可不是這樣的 , 那就來寫一個像QQ一樣的聊天程序吧

TCP實現 🍀

因為TCP是有鏈接的 , 這就導致只能有一個服務端 , 但是可以有多個客戶端

tcpqq_server.py

import socket sock = socket.socket() sock.bind(('127.0.0.1', 8080)) sock.listen(5) # 實現鏈接循環 while True: print("Watiting for the link...") conn, addr = sock.accept() print("Your friend {} is online...".format(addr)) # 實現通信循環 while True: messages = conn.recv(1024) print("Messages from [{}]:{}".format(addr, messages.decode('utf-8'))) if messages == b'q': break else: while True: data = input("Please input the messages to be sent:").strip().encode('utf-8') # 注意發送的內容不能為空,否則接收方就會一直等下去 if not data: print("Can't be empty...") continue conn.send(data) break print("Your friend {} is offline...".format(addr)) conn.close() sock.close() 

tcpqq_client.py

import socket sock = socket.socket() sock.connect(('127.0.0.1', 8080)) # 實現通信循環 while True: messages = input("Please input your messages to be sent:").strip().encode('utf-8') # 注意發送的內容不能為空,否則接收方就會一直等下去 if not messages: print("Can't be empty...") continue elif messages == b'q': break else: sock.send(messages) data = sock.recv(1024) print("Messages from [{}]:{}".format(('127.0.0.1', 8080), data.decode('utf-8'))) sock.close() 

當然實際應用中是不會用TCP來完成的 , 而是用UDP , 這里只是模擬 , 並且以上還有有問題沒有解決的 , 比如如果發送的消息大於1024字節 , 那么就不能完整接收信息了 , 后續再進行處理

TCP版本的服務端可以允許同時連入5個客戶端 , 值得注意的是並不是同時連入 , 按照順序排隊 , 只有前面的人說完了會連入后序的客戶端

UDP實現 🍀

以為UDP是無鏈接的 , 所以它可以實現想跟誰說話就跟誰說話

udpqq_server.py

import socket sock = socket.socket(type=socket.SOCK_DGRAM) sock.bind(('127.0.0.1', 8080)) # 實現通信循環 while True: data, addr = sock.recvfrom(1024) print("Receive a message from {}:{}".format(addr, data.decode('utf-8'))) if data == b'q': break while True: messages = input("Please input the messages to be sent:").strip().encode('utf-8') if not messages: print("Can't be empty...") continue sock.sendto(messages, addr) break sock.close() 

udpqq_client.py

import socket sock = socket.socket(type=socket.SOCK_DGRAM) # 實現通信循環 while True: messages = input("Please input your messages to be sent:").strip().encode('utf-8') if not messages: print("Can't be empty...") continue elif messages == b'q': break else: sock.sendto(messages, ('127.0.0.1',8080)) data, addr = sock.recvfrom(1024) print("Receive a message from {}:{}".format(addr, data.decode('utf-8'))) sock.close() 

利用UDP實現才更接近現實 , 我們只需要知道他的ip和端口 , 我們就可以跟他講話 , 在他即可以是服務端 , 也可以是客戶端 , 不過必須注意接收和發送流程的問題

以上兩種實現方式 , 都只是最基礎的版本 , 在UDP中我們可以將所有人的ip和端口放到一個字典里或者其他存儲里 , 利用ip和端口就可以實現跟所有人進行聊天了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM