Я играю с программированием сокетов в 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)