Python是最通用的编程语言之一,并且可以通过其各种应用程序观察到这一点。这是一个示例,说明如何使用python建立一个简单的基于命令行的聊天室,该聊天室易于实现和理解。聊天室是一种媒介/界面,允许两个或更多人聊天并将消息发送给每个人。它也可以是人际(一对一)和群聊。在本教程中,我们将建立一个可以同时容纳两个以上客户的群聊室。
对于聊天室,我们将使用服务器-客户端体系结构。这意味着一台服务器将托管多个客户端。
在深入研究代码之前,我们要了解的最后一件事就是遵循此体系结构,我们需要编写两个脚本,一个用于服务器端,另一个用于客户端。需要非常清楚的一件事是客户端将仅通过服务器进行对话。他们之间将没有直接的沟通。因此,让我们深入研究代码。
服务器端代码:
首先,我们将导入两个名为“ socket”和“ threading”的库。两者都是内置库,因此无需pip安装它们。只需导入即可。套接字编程是一种连接网络上的两个节点以相互通信的方式,而线程模块提供了一个非常简单直观的API,用于在程序中生成多个线程。然后,我们将继续定义IP和端口。需要知道只能使用未保留的端口,因为这将在LocalHost上起作用,如果使用保留的端口,计算机可能会引起问题。
在定义套接字时,将使用名为(AF_INET)和(SOCK_STREAM)的两个参数。第一个指示Internet套接字的使用,另一个指示TCP的使用。然后我们继续定义广播功能。它的基本功能是向客户端列表中的客户端发送消息。此功能尚未停用。我们还将在其他地方使用它。处理客户是一项艰巨的工作,功能也是如此。它首先尝试是否可以从客户端接收到消息,如果是,则将其广播。
但是,如果有任何类型的错误/问题,服务器将使事情变得简单。它只是删除客户端。我们已经做了很多工作,但是添加客户仍然在等待。所以现在就开始做。在接收功能中,关键字“ NICKNAME”被发送到客户端,这意味着要求其昵称。稍后在获得昵称后,它将客户端添加到列表中。
好了,此循环保持活动状态,并且多个客户端可以加入服务器。您需要拥有正确的IP和端口地址的所有内容。
#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()
客户端代码:
这是我们的第二个代码,我们将在此为客户编写脚本。此代码足以使我们获得多个客户,而不会出现任何问题。因此,我们从导入套接字和线程开始。初始化套接字后,我们需要将其连接到IP和端口。它们必须与服务器相同才能正常运行。
现在,我们需要连接到服务器,如果您还记得“ NICKNAME”是服务器发送的用于询问昵称的关键字,则如果客户端收到该昵称,它将发送该昵称并进入聊天室。但是,如果无法接收该关键字,则连接会丢失。现在我们已连接到服务器,为什么要等待,让我们开始消息传递。
为此,我们有了写功能来管理消息的发送。如果您想知道如何接收消息,请记住我们导入了线程。在这里发挥作用,我们需要两个线程开始并完成。
您已经注意到,在发送之前,我们已经将消息编码为ASCII,这是因为我们只能以字节形式发送消息,而不能以字符串形式发送消息。因此,请务必记住在发送之前进行编码,在接收之后进行解码。
#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()
在现实世界中进行测试:
请记住,服务器将首先运行,然后可以加入多个客户端。这可以在命令行中运行,但是我们需要不同的终端来单独执行它们。
以上就是关于使用Python创建基于命令行的聊天室的全部内容,想了解更多关于Python的信息,请继续关注。