Отправка команд на сервер Python - PullRequest
0 голосов
/ 27 октября 2011

Здравствуйте, я написал некоторый код клиент-сервер и напишу сейчас. Я заметил, что у меня возникла ошибка при обработке команды

Это мои команды

#Server Commands
CMD_MSG, CMD_MULTI, CMD_IP, CMD_AUDIO, CMD_AUDIO_MULTI, CMD_FILE = range(6)

Я отправляюкоманда, подобная этой

self.client(chr(CMD_AUDIO), data)

и полученная как эта

msg = conn.recv(2024)
if msg:                
    cmd, msg = ord(msg[0]),msg[1:]
    if cmd == CMD_MSG:
        #do something

Первая команда, кажется, работает, но если я вызываю любую другую, она, кажется, проходит через них все.Это действительно странно

Я могу опубликовать больше кода, если это необходимо.

Но любые идеи о том, как обрабатывать команды, отправляемые на мой сервер, были бы хороши

* ура

1 Ответ

1 голос
/ 27 октября 2011

Если вы используете потоковый сокет (TCP), первое правило потоковых сокетов состоит в том, что вы не будете получать данные в тех же группах, в которых они были отправлены. Если вы отправляете три сообщения по 10 байтов каждое, вы можете получить на другом конце один блок из 30 байтов, 30 блоков по одному байту каждое или что-либо между ними.

Вы должны структурировать свой протокол так, чтобы получатель знал, какова длина каждого сообщения в потоке (либо путем добавления поля длины, либо с помощью форматов сообщений фиксированной длины), и вы должны сохранить неиспользованную часть любого recv () который пересекает границу сообщения для использования в следующем сообщении.

Альтернативой потоковым / TCP-сокетам является датаграмма / UDP-сокеты. Они сохраняют границы сообщений, но не гарантируют доставку или упорядочение сообщений. В зависимости от того, что вы делаете, это может быть приемлемым, но, вероятно, нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...