软件研发

使用Python创建基于命令行的聊天室

2020-07-22 16:49:33 | 来源:中培企业IT培训网

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的信息,请继续关注中培教育。

标签: Python 软件研发

预约领优惠