2013-09-07 1 views
0

Я успешно написал приложение чата клиент-сервер 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 

Любая оцененная помощь и приносим извинения за странные pseodocode python-esqe.

ответ

0

Чтобы сделать вещи более масштабируемыми, ваше приложение может извлечь выгоду из использования нескольких потоков как на стороне клиента, так и на стороне сервера. Обязательно используйте блокировки при работе с общими данными.

Во-первых, клиентская сторона, безусловно, может выиграть от использования трех потоков. Первый поток может прослушивать ввод с сервера (вызов recvfrom()). Второй поток может прослушивать ввод от пользователя и помещать эти сообщения в очередь. Третий поток может обрабатывать сообщения из очереди и вызывать socket.send() для отправки этих сообщений на сервер.

Поскольку сервер обрабатывает несколько клиентов, он также может воспользоваться потоками для прослушивания сообщений от клиента и их обработки. Еще раз, вы можете использовать один поток для получения сообщений от клиента, а затем очереди их. Вы можете использовать второй поток для обработки полученных сообщений (обязательно хранить информацию о клиенте) и вызывать sendto() для отправки responese; btw, recvfrom() предоставляет информацию о клиенте.