socket.send и socket.recv, используемые один за другим, приводят к несинхронизированной связи клиент-сервер Python3 - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать что-то вроде диалога между сервером и клиентом.Это объясняется следующим:

Client      +   Server
---------------------
send(foo)   |  recv(foo)
recv(bar)   |  send(bar)
send(foobar)|  recv(foobar)
recv(barfoo)|  send(barfoo)
etc.....................

Итак, все, что я пытаюсь сделать, - это добиться успешного «диалогового» обмена сообщениями между сервером и клиентом.Проблема в том, что через некоторое время одна из двух конечных точек выйдет из синхронизации.Это приводит к тому, что терминал работает в состоянии, когда обе стороны приостановили свое выполнение, пытаясь выполнить блокирующий вызов send или recv, конечно, не имея возможности.

Есть ликакие операции мне не хватает?

Я создаю сокеты со следующим кодом (Python3)

Для сервера:

#!/usr/bin/python3
#server.py

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((str(address_port[0]), int(address_port[1])))
serversocket.listen()
clientsocket, addr = serversocket.accept()
msg_rcv = clientsocket.recv(1024)           # recv foo
clientsocket.send("foo".encode('ascii'))    # send bar
msg_rcv = clientsocket.recv(1024)           # recv foobar
clientsocket.send("foo".encode('ascii'))    # send barfoo
#etc...

Для клиента:

#!/usr/bin/python3
#client.py

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((host, port))
clientsocket.send("foo".encode('ascii'))    # send foo
msg_rcv = clientsocket.recv(1024)           # recv bar
clientsocket.send("foobar".encode('ascii')) # send foobar
msg_rcv = clientsocket.recv(1024)           # recv barfoo

Любая помощь будет принята с благодарностью.

...