Python是最通用的編程語言之一,并且可以通過其各種應(yīng)用程序觀察到這一點。這是一個示例,說明如何使用python建立一個簡單的基于命令行的聊天室,該聊天室易于實現(xiàn)和理解。聊天室是一種媒介/界面,允許兩個或更多人聊天并將消息發(fā)送給每個人。它也可以是人際(一對一)和群聊。在本教程中,我們將建立一個可以同時容納兩個以上客戶的群聊室。
對于聊天室,我們將使用服務(wù)器-客戶端體系結(jié)構(gòu)。這意味著一臺服務(wù)器將托管多個客戶端。
在深入研究代碼之前,我們要了解的最后一件事就是遵循此體系結(jié)構(gòu),我們需要編寫兩個腳本,一個用于服務(wù)器端,另一個用于客戶端。需要非常清楚的一件事是客戶端將僅通過服務(wù)器進(jìn)行對話。他們之間將沒有直接的溝通。因此,讓我們深入研究代碼。
服務(wù)器端代碼:
首先,我們將導(dǎo)入兩個名為“ socket”和“ threading”的庫。兩者都是內(nèi)置庫,因此無需pip安裝它們。只需導(dǎo)入即可。套接字編程是一種連接網(wǎng)絡(luò)上的兩個節(jié)點以相互通信的方式,而線程模塊提供了一個非常簡單直觀的API,用于在程序中生成多個線程。然后,我們將繼續(xù)定義IP和端口。需要知道只能使用未保留的端口,因為這將在LocalHost上起作用,如果使用保留的端口,計算機可能會引起問題。
在定義套接字時,將使用名為(AF_INET)和(SOCK_STREAM)的兩個參數(shù)。第一個指示Internet套接字的使用,另一個指示TCP的使用。然后我們繼續(xù)定義廣播功能。它的基本功能是向客戶端列表中的客戶端發(fā)送消息。此功能尚未停用。我們還將在其他地方使用它。處理客戶是一項艱巨的工作,功能也是如此。它首先嘗試是否可以從客戶端接收到消息,如果是,則將其廣播。
但是,如果有任何類型的錯誤/問題,服務(wù)器將使事情變得簡單。它只是刪除客戶端。我們已經(jīng)做了很多工作,但是添加客戶仍然在等待。所以現(xiàn)在就開始做。在接收功能中,關(guān)鍵字“ NICKNAME”被發(fā)送到客戶端,這意味著要求其昵稱。稍后在獲得昵稱后,它將客戶端添加到列表中。
好了,此循環(huán)保持活動狀態(tài),并且多個客戶端可以加入服務(wù)器。您需要擁有正確的IP和端口地址的所有內(nèi)容。
#Coded by Yashraj Singh Chouhan
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 declaration
for client in clients:
client.send(message)
def handle(client):
while True:
try: #recieving valid messages from client
message = client.recv(1024)
broadcast(message)
except: #removing clients
index = 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 clients
while 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()
客戶端代碼:
這是我們的第二個代碼,我們將在此為客戶編寫腳本。此代碼足以使我們獲得多個客戶,而不會出現(xiàn)任何問題。因此,我們從導(dǎo)入套接字和線程開始。初始化套接字后,我們需要將其連接到IP和端口。它們必須與服務(wù)器相同才能正常運行。
現(xiàn)在,我們需要連接到服務(wù)器,如果您還記得“ NICKNAME”是服務(wù)器發(fā)送的用于詢問昵稱的關(guān)鍵字,則如果客戶端收到該昵稱,它將發(fā)送該昵稱并進(jìn)入聊天室。但是,如果無法接收該關(guān)鍵字,則連接會丟失。現(xiàn)在我們已連接到服務(wù)器,為什么要等待,讓我們開始消息傳遞。
為此,我們有了寫功能來管理消息的發(fā)送。如果您想知道如何接收消息,請記住我們導(dǎo)入了線程。在這里發(fā)揮作用,我們需要兩個線程開始并完成。
您已經(jīng)注意到,在發(fā)送之前,我們已經(jīng)將消息編碼為ASCII,這是因為我們只能以字節(jié)形式發(fā)送消息,而不能以字符串形式發(fā)送消息。因此,請務(wù)必記住在發(fā)送之前進(jìn)行編碼,在接收之后進(jìn)行解碼。
#Coded by Yashraj Singh Chouhan
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 connection
try:
message = client.recv(1024).decode('ascii')
if message == 'NICKNAME':
client.send(nickname.encode('ascii'))
else:
print(message)
except: #case on wrong ip/port details
print("An error occured!")
client.close()
break
def write():
while True: #message layout
message = '{}: {}'.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()
在現(xiàn)實世界中進(jìn)行測試:
請記住,服務(wù)器將首先運行,然后可以加入多個客戶端。這可以在命令行中運行,但是我們需要不同的終端來單獨執(zhí)行它們。
以上就是關(guān)于使用Python創(chuàng)建基于命令行的聊天室的全部內(nèi)容,想了解更多關(guān)于Python的信息,請繼續(xù)關(guān)注中培偉業(yè)。