使用Python实现一个简单的聊天室
Python是一個非常靈活的編程語言,我們現在到處可見用Python編寫的應用程序。本文就是一個很簡單的使用Python來編寫的一個機遇命令行的聊天室,他非常簡單和易于理解。讓我們開始吧。
聊天室是什么?
聊天室就是一個媒介或者接口,允許兩個或多個用戶聊天或者發送信息。它既可以是一對一的聊天也可以是群聊。我們這個例子中,將會創建一個群聊天室,他可以同時支持多于兩個人在線。
架構
對聊天室,我們使用服務器-客戶端的架構。這就意味著一臺服務器將托管多臺客戶機器。
?
準備開始:
在深入代碼之前,我們需要知道的最后一件事就是,我們需要些兩個script,一個是server端的,一個是client端的。我們需要很清晰地知道,client端是只和server端通信。client之間是沒有通信的。下面,我們來看具體的代碼。
服務器端的代碼:
首先, 我們需要import兩個庫,一個是”socket”一個是”threading”。這兩個都是內建的庫,所以不需要額外進行安裝。只要import他們就可以了。Socket是用來連接網絡中的多個節點,并進行通信的。Threading模塊提供了很簡單直觀的接口可以在程序中產生多個線程。下面我們來定義我們的IP和端口。這里我們只能使用沒有被保留的端口,因為我們是在本地機器上測試的,假如使用了保留的端口,那么會有很多意想不到的問題。
當我們開始定義socket的時候,有兩個參數(AF_INET)和(SOCK_STREAM)會被使用到。第一個表示使用internet socket另一個表示使用TCP。下面我們就來實現廣播的功能。他的基本功能就是把信息發送給所有的在client列表中的客戶端。這個功能還不止會用在這里,我們還會在別的地方使用他。處理客戶端是非常麻煩的事情,這個也是這樣。他首先會試一下能否成client端接收到信息,假如可以的話,他才會廣播。
假如這里有任何的錯誤或者問題的話,我們這里就簡單處理一下,直接把client移除了。我們已經做了很多工作,但是添加客戶端到目前為止還沒有實現。所以,下面我們就來實現它。在接收端,這個關鍵字“NICKNAME”會被發送給客戶端,這也意味著我們需要他們的名稱。然后,我們收到他們的nickname之后,就可以把他們加入到客戶端列表了。
這個循環是一直運行得,所以多個客戶端可以同時加入到服務器中來。你所需要做的就是,讓他有正確的IP和端口。
代碼:
import socket, threading #Libraries import host = '127.0.0.1' #LocalHost port = 7976 #Choosing unreserved port server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket initialization server.bind((host, port)) #binding host and port to socket server.listen() clients = [] nicknames = [] def broadcast(message): #broadcast function declarationfor client in clients:client.send(message) def handle(client): while True:try: #recieving valid messages from clientmessage = client.recv(1024)broadcast(message)except: #removing clientsindex = clients.index(client)clients.remove(client)client.close()nickname = nicknames[index]broadcast('{} left!'.format(nickname).encode('ascii'))nicknames.remove(nickname)break def receive(): #accepting multiple clientswhile True:client, address = server.accept()print("Connected with {}".format(str(address))) client.send('NICKNAME'.encode('ascii'))nickname = client.recv(1024).decode('ascii')nicknames.append(nickname)clients.append(client)print("Nickname is {}".format(nickname))broadcast("{} joined!".format(nickname).encode('ascii'))client.send('Connected to server!'.encode('ascii'))thread = threading.Thread(target=handle, args=(client,))thread.start() receive()客戶端代碼:
這是第二段代碼,我們為客戶端實現寫的代碼。這個代碼足夠我們創建多個client而沒有問題。我們還是從import socket和threading開始。在初始化socket之后,我們需要把它連接到對應的IP和端口。他們需要和服務器端的一樣,這樣才能工作。
現在我們可以連接服務器端了,你還記得server端會發要求來輸入nickname吧,客戶端接收到這個,發送nickname給服務端,他就可以進入聊天室了。假如沒有接收到這個請求,那么連接就斷了。現在我們連接到服務端了,還等什么?開始聊天吧。
我們寫了一個write的函數來管理message的發送。假如你想知道怎么接收信息,還記得我們import的threading嗎?這里我們需要兩個thread來處理,就成功了。
你可能會發現我們在發送message之前,把它編碼成ASCII了,這是因為我們發送的message是byte的格式,而不是string的格式。所以,記住,發送前編碼,接收到后需要解碼哦。
代碼:
import socket, threading nickname = input("Choose your nickname: ") client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket initialization client.connect(('127.0.0.1', 7976)) #connecting client to server def receive():while True: #making valid connectiontry:message = client.recv(1024).decode('ascii')if message == 'NICKNAME':client.send(nickname.encode('ascii'))else:print(message)except: #case on wrong ip/port detailsprint("An error occured!")client.close()break def write():while True: #message layoutmessage = '{}: {}'.format(nickname, input(''))client.send(message.encode('ascii')) receive_thread = threading.Thread(target=receive) #receiving multiple messages receive_thread.start() write_thread = threading.Thread(target=write) #sending messages write_thread.start()測試結果:
記住,服務器端代碼要先運行,然后多個客戶端可以加入。這個可以在命令行運行。但是我們需要不同的終端來分別運行他們。
這就是所有的代碼了,希望你會喜歡他。
更多原創,敬請關注微信公眾號,每日更新業界最新資訊:
歡迎訪問個人小站:?https://donggeitnote.com/2020/07/09/python-chatroom/
總結
以上是生活随笔為你收集整理的使用Python实现一个简单的聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Peer-to-Peer Sockets
- 下一篇: 智慧职教,云课堂app