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

时间:2013-09-07 03:57:12

标签: 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

...

我对服务器的设计感到满意,但客户端非常繁琐。

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

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伪代码,任何帮助表示赞赏和道歉。

1 个答案:

答案 0 :(得分:0)

为了使事情更具可伸缩性,您的应用程序可以从客户端和服务器端使用多个线程中受益。处理常见数据时务必使用锁。

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

由于服务器正在处理多个客户端,因此也可以通过让线程侦听来自客户端的消息并处理它们来获益。再次,您可以使用一个线程从客户端获取消息,然后排队。您可以使用第二个线程处理收到的消息(确保存储客户端信息)并调用sendto()发送responese;顺便说一句,recvfrom()确实提供了客户信息。