Я играю с программированием сокетов в Python 2 и пробую select()
для сценария сервера. Когда у меня есть следующий код для сервера:
print('Server started in port {}.'.format(self.port))
server_socket = socket.socket()
server_socket.bind((self.address, self.port))
server_socket.listen(5)
client_sockets = [server_socket]
while True:
for s in client_sockets:
if s is server_socket:
client_socket, address = server_socket.accept()
client_sockets.append(client_socket)
print('Connection received.')
else:
data = s.recv(200)
if data:
print('Received: {}'.format(data.decode().strip()))
else:
client_sockets.remove(s)
s.close()
Сервер получает только первое сообщение от клиента. Однако второе и последующие сообщения будут получены только при перезапуске клиента. Это сбивает меня с толку (которое я приписываю своим недостаточным знаниям в области сетей). Данные, кажется, буферизуются. Почему это происходит?
Я пробовал это:
client_sockets = [server_socket]
while True:
readable, writable, errored = select.select(client_sockets, [], [])
for s in readable:
if s is server_socket:
...
И, наконец, теперь сервер может получать второе и последующие сообщения от клиента.
Вот код для клиента:
class BasicClient(object):
def __init__(self, name, address, port):
self.name = name
self.address = address
self.port = int(port)
self.socket = socket.socket()
def connect(self):
self.socket.connect((self.address, self.port))
self.socket.send(self.name)
def send_message(self, message):
self.socket.send(message.encode())
args = sys.argv
if len(args) != 4:
print "Please supply a name, server address, and port."
sys.exit()
client = BasicClient(args[1], args[2], args[3])
client.connect()
while True:
message = raw_input('Message: ')
# We pad the message by 200 since we only expect messages to be
# 200 characters long.
num_space_pads = min(200 - len(message), 200)
message = message.ljust(num_space_pads, ' ')
client.send_message(message)
send
может быть разбит, и получателю потребуется несколько вызововrecv
, чтобы получить все. Или что в одномrecv
может быть получено более одногоsend
. И последнее может включать частичные сообщения. - person Some programmer dude   schedule 27.02.2019