上班是幫老板賺錢(qián),摸魚(yú)才是賺老板的錢(qián)。
日常摸魚(yú)跟小伙伴聊天是我們經(jīng)常干的事兒,但是對(duì)于有些位置不好的同學(xué),背對(duì)領(lǐng)導(dǎo)或者坐在過(guò)道中的,就需要時(shí)刻盯防經(jīng)過(guò)的人,以防自己上班聊天劃水摸魚(yú)被抓現(xiàn)行,那么今天就來(lái)介紹如何使用Python創(chuàng)建一個(gè)聊天室。

在網(wǎng)絡(luò)編程中,Socket 是一種通信機(jī)制,允許計(jì)算機(jī)在網(wǎng)絡(luò)上相互通信。Python 中的 socket 庫(kù)提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序,本文將介紹socket庫(kù)的基本概念、創(chuàng)建和使用套接字(Socket)的方法以及一些常見(jiàn)的網(wǎng)絡(luò)編程用例。
Socket 是一種通信的端點(diǎn),可以通過(guò)網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)。在網(wǎng)絡(luò)編程中,通常使用兩種類型的Socket:服務(wù)器端套接字和客戶端套接字。服務(wù)器端套接字等待來(lái)自客戶端的連接請(qǐng)求,而客戶端套接字嘗試與服務(wù)器端建立連接。
import socket# 創(chuàng)建服務(wù)器端套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口server_address = ('localhost', 8888)server_socket.bind(server_address)# 監(jiān)聽(tīng)連接請(qǐng)求server_socket.listen(5)print('Waiting for client to connect...')# 接受客戶端連接client_socket, client_address = server_socket.accept()print('Connection from:', client_address)# 接收數(shù)據(jù)data = client_socket.recv(1024)print('Received:', data.decode())# 發(fā)送數(shù)據(jù)message = 'Hello, client!'client_socket.send(message.encode())# 關(guān)閉連接client_socket.close()server_socket.close()通過(guò)上面的代碼我們成功出創(chuàng)建了一個(gè)聊天室的服務(wù)器,其中的ip可以替換成你自己電腦的ip地址,這樣比人就可以通過(guò)IP:Port來(lái)鏈接你的電腦。

運(yùn)行后我們可以看到服務(wù)器目前正在等待連接中,接下來(lái)我們就創(chuàng)建客戶端來(lái)鏈接服務(wù)器。
import socket# 創(chuàng)建客戶端套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 連接到服務(wù)器server_address = ('localhost', 8888)client_socket.connect(server_address)# 發(fā)送數(shù)據(jù)message = 'Hello, server!'client_socket.send(message.encode())# 接收數(shù)據(jù)data = client_socket.recv(1024)print('Received:', data.decode())# 關(guān)閉連接client_socket.close()通過(guò)上面的代碼我們已經(jīng)成功創(chuàng)建好了客戶端,鏈接服務(wù)器地址哪里修改成服務(wù)器的對(duì)應(yīng)IP和端口就行了,接下來(lái)我們就來(lái)鏈接服務(wù)器。


可以看到運(yùn)行客戶端后我們可以看到服務(wù)端和客戶端都有反應(yīng),服務(wù)端收到客戶端的連接后發(fā)送了一天消息,客戶端同時(shí)也收到了服務(wù)端發(fā)來(lái)的消息,這兩條消息是我們指定的,并且發(fā)送一條后聊天室就關(guān)閉,接下來(lái)我們來(lái)優(yōu)化一下
這里我們使用多線程來(lái)創(chuàng)建一個(gè)持久性連接的聊天室。
服務(wù)器:
import socketimport threadingdef handle_client(client_socket): while True: # 接收客戶端消息 data = client_socket.recv(1024) if not data: break # 如果客戶端斷開(kāi)連接,退出循環(huán) message = data.decode() print(f"Received from {client_socket.getpeername()}: {message}") # 廣播消息給所有客戶端 broadcast(message, client_socket) # 關(guān)閉連接 print(f"Connection from {client_socket.getpeername()} closed.") clients.remove(client_socket) client_socket.close()def broadcast(message, sender_socket): for client in clients: if client != sender_socket: try: client.send(message.encode()) except: # 如果發(fā)送失敗,說(shuō)明客戶端已斷開(kāi)連接,移除該客戶端 clients.remove(client)# 創(chuàng)建服務(wù)器端套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口server_address = ('localhost', 8888)server_socket.bind(server_address)# 監(jiān)聽(tīng)連接請(qǐng)求server_socket.listen(5)print('Waiting for clients to connect...')# 存儲(chǔ)所有客戶端套接字的列表clients = []while True: # 接受客戶端連接 client_socket, client_address = server_socket.accept() print(f"Connection from {client_address} established.") # 存儲(chǔ)客戶端套接字到列表 clients.append(client_socket) # 創(chuàng)建一個(gè)線程來(lái)處理客戶端 client_handler = threading.Thread(target=handle_client, args=(client_socket,)) client_handler.start()客戶端:
import socketimport threadingdef receive_messages(): while True: try: # 接收服務(wù)器端消息 data = client_socket.recv(1024) if not data: break # 如果服務(wù)器端斷開(kāi)連接,退出循環(huán) message = data.decode() print("Received:", message) except: break# 創(chuàng)建客戶端套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 連接到服務(wù)器server_address = ('localhost', 8888)client_socket.connect(server_address)# 創(chuàng)建一個(gè)線程來(lái)接收服務(wù)器端消息receive_thread = threading.Thread(target=receive_messages)receive_thread.start()# 發(fā)送消息到服務(wù)器while True: message = input("我是客戶端1: ") client_socket.send(message.encode())這里注意,服務(wù)器和客戶端是存在不同的py文件中的,就是說(shuō)如果幾個(gè)人中需要一個(gè)人創(chuàng)建服務(wù)區(qū)和聊天室的話就需要?jiǎng)?chuàng)建兩個(gè)py文件。
然后其他小伙伴就只需要?jiǎng)?chuàng)建一個(gè)聊天室就行了,在客戶端中的message標(biāo)明你是誰(shuí)就行,接下來(lái)我們開(kāi)始實(shí)驗(yàn)。



這里可以看到我們成功搭建了一個(gè)微型聊天室,每個(gè)客戶端都能收到其他客戶發(fā)送的消息,而服務(wù)端可以看到所有客戶端所發(fā)送的消息。
以上就是使用Python中的socket庫(kù)搭建一個(gè)微型的聊天室,在里面不僅可以進(jìn)行實(shí)時(shí)聊天,還可以傳送文件、遠(yuǎn)程命令執(zhí)行或者聯(lián)網(wǎng)小游戲。
當(dāng)然我給出的示例只是一個(gè)簡(jiǎn)單的多線程聊天室的示例,只是用于娛樂(lè),如果想要在項(xiàng)目中實(shí)際應(yīng)用則需要考慮到更多的安全性和錯(cuò)誤的處理,如果需要更高級(jí)的異步處理,還會(huì)用到asyncio。
本文鏈接:http://m.www897cc.com/showinfo-26-64503-0.htmlPython系列:摸魚(yú)小利器,使用Python創(chuàng)建一個(gè)聊天室
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 生成式 AI 帶給軟件開(kāi)發(fā)的三個(gè)幻覺(jué):速度快、質(zhì)量高、人更少
下一篇: C++中的引用詳解