Networking 在客户端-服务器聊天程序中处理多个不同的请求和响应

Networking 在客户端-服务器聊天程序中处理多个不同的请求和响应,networking,udp,state-machine,Networking,Udp,State Machine,我已经成功地编写了一个UDP客户机-服务器聊天应用程序,但我处理请求和响应的方法很粗糙,而且伸缩性不强。服务器基本上侦听传入的消息,然后根据消息类型运行一些代码: if command == "CONN": # handle new connection from client then send "OK" if command == "MSG": # send message to other connected clients ... 我对服务器的设计很满意,但客户端确

我已经成功地编写了一个UDP客户机-服务器聊天应用程序,但我处理请求和响应的方法很粗糙,而且伸缩性不强。服务器基本上侦听传入的消息,然后根据消息类型运行一些代码:

if command == "CONN":
    # handle new connection from client then send "OK"

if command == "MSG":
    # send message to other connected clients

...
我对服务器的设计很满意,但客户端确实很精细

以下是客户端可以从服务器发送的命令示例:

Command Name | Argument          | Outcome/Description
------------------------------------------------------------------------------
CONN         | username          | OK, ERR, or timeout if server isn't running
MSG          | message           | -
USRS         | -                 | ["username1", "username2"]
QUIT         | -                 | -
USRC         | username          | new user connected
USRD         | username          | user disconnected
MSG          | username, message | print message from user
SHDW         | -                 | server shut down
并从服务器接收:

Command Name | Argument          | Outcome/Description
------------------------------------------------------------------------------
CONN         | username          | OK, ERR, or timeout if server isn't running
MSG          | message           | -
USRS         | -                 | ["username1", "username2"]
QUIT         | -                 | -
USRC         | username          | new user connected
USRD         | username          | user disconnected
MSG          | username, message | print message from user
SHDW         | -                 | server shut down
基本上,我很难构建一个系统来处理这些不同的命令和响应。我知道我有某种状态机,可以在脑海中构思出一个解决方案,但我似乎无法将其转化为除以下内容以外的任何内容:

socket.send("CONN username")
    if response == "OK":
        # connected to the server ok
    if response == "ERR":
        # oops, there was a problem of sorts
    # otherwise handle timeout

socket.send("USRS")
    if response == "":
        # no other users connected
    else:
        # print users

# start main listening loop
while True:
    # send typed text as MSG
    # handle any messages received from the server on separate thread

对于奇怪的python esqe伪代码,任何帮助都表示感谢和歉意。

为了使事情更具可伸缩性,您的应用程序可以从客户端和服务器端使用多线程中获益。在处理公共数据时,请确保使用锁

首先,客户端当然可以从使用三个线程中获益。第一个线程可以侦听来自服务器的输入(recvfrom()调用)。第二个线程可以侦听用户的输入,并将这些消息放入队列中。第三个线程可以处理来自队列的消息,并调用socket.send()将这些消息发送到服务器

由于服务器正在处理多个客户机,因此它还可以从使用线程侦听来自客户机的消息并对其进行处理中获益。同样,您可以使用一个线程从客户端获取消息,然后对它们进行排队。您可以使用第二个线程处理收到的消息(确保存储客户端信息),并调用sendto()发送响应;顺便说一句,recvfrom()确实提供了客户机信息