У меня есть связь между сервером и клиентом, организованная через библиотеку сокетов в python.
В Интернете много материалов о том, как его использовать, и это кажется довольно простым ref 1 .
Всегда существует цикл True, который продолжает принимать соединения, и я понимаю, что он будет принимать только одно за раз, обслуживать его и переходить к следующему в очереди.Глубина очереди определяется socket.listen (N), где N - глубина.
Я создаю сервер сокетов.
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.bind(('', port))
self.sock.listen(10)
self.socket_port = port
У меня есть цикл True, который ожидаетподключение сокета, чтобы прибыть
def run_socket(self):
'''
creates a separete thread for server_thread function
'''
start_new_thread(self.server_thread,())
def server_thread(self):
self.is_running = True
self.update_CAS()
while self.is_running:
self.client, self.addr = self.sock.accept()
info( 'Client has connected: %r %r' % (self.client, self.addr ))
##Here I have code to service the incoming connection from the
###client. The client closes connection when it receives the
###response. THis section is not shown for simplicity.
Так что это работает хорошо.Тем не менее, я получил случаи, когда 2 клиента подключались в течение нескольких миллисекунд, см. Ниже.Второй клиент был обслужен правильно, но первый не был, потому что сокет был перезаписан вторым.Он потребовал ввода от второго клиента и
Мне нужен сервер, который может ставить клиентов в очередь, но одновременно будет обслуживать только одного клиента.
2018-06-08 13:17:37,838 INFO: Client has connected: <socket._socketobject object at 0x084B0E68> ('128.231.5.169', 60915)
2018-06-08 13:17:37,838 INFO: input from the client: [4, [1000, 4000]] with client, addr = (<socket._socketobject object at 0x084B0E68>,('128.231.5.169', 60915))
2018-06-08 13:17:37,854 INFO: checking buffer status True, nan
2018-06-08 13:17:37,854 DEBUG: Reply has been generated and sent back
2018-06-08 13:17:39,104 INFO: Client has connected: <socket._socketobject object at 0x084B0F80> ('128.231.5.59', 51292)
2018-06-08 13:17:39,118 INFO: Client has connected: <socket._socketobject object at 0x084B0E68> ('128.231.5.169', 60916)
2018-06-08 13:17:39,134 INFO: input from the client: [4, [1000, 4000]] with client, addr = (<socket._socketobject object at 0x084B0E68>,('128.231.5.169', 60916))
2018-06-08 13:17:39,134 INFO: checking buffer status True, nan
2018-06-08 13:17:39,134 DEBUG: Reply has been generated and sent back
2018-06-08 13:17:39,165 INFO: input from the client: [4, [2000, 5000]] with client, addr = (<socket._socketobject object at 0x084B0E68>,('128.231.5.169', 60916))
2018-06-08 13:17:39,165 INFO: checking buffer status True, nan
2018-06-08 13:17:39,165 DEBUG: Reply has been generated and sent back
2018-06-08 13:17:40,400 INFO: Client has connected: <socket._socketobject object at 0x084B0DF8> ('128.231.5.169', 60917)
2018-06-08 13:17:40,415 INFO: input from the client: [4, [1000, 4000]] with client, addr = (<socket._socketobject object at 0x084B0DF8>,('128.231.5.169', 60917))
Я знаю, что это занимает ~ 70- 100 мс для обслуживания одного клиента:
2018-06-07 22:50:59,750 INFO: Client has connected: <socket._socketobject object at 0x0760DE68> ('128.231.5.82', 54184)
2018-06-07 22:50:59,765 INFO: input from the client: [4, [1000, 3000]]
2018-06-07 22:50:59,769 DEBUG: Reply has been generated and sent back
2018-06-07 22:50:59,772 INFO: true checking buffer status 0.0
2018-06-07 22:50:59,821 DEBUG: checking buffer status 28.375206497045973
Этого не должно было быть.Я прав?
Я проверил его с помощью простого сервера кодов \ клиент:
"""
Simple SOCKET server for testing\learning purposes
"""
import socket
sock = socket.socket()
port = 2033
sock.bind(('',port))
sock.listen(5)
while True:
client, adrr = sock.accept()
print('Got connection from ' , adrr)
x = raw_input('keyboard input')
client.send('Connection Received %r' % x)
client.close()
и клиент
# Import socket module
import socket
def connection():
# Create a socket object
s = socket.socket()
# Define the port on which you want to connect
port = 2033
# connect to the server on local computer
s.connect(('127.0.0.1', port))
# receive data from the server
print s.recv(1024)
# close the connection
s.close()
Клиент:
>>> connection();connection();
Connection Received '1'
Connection Received '2'
>>>
Сервер:
('Got connection from ', ('127.0.0.1', 49436))
keyboard input:1
('Got connection from ', ('127.0.0.1', 49437))
keyboard input:2
Наверное, главный вопрос: что происходит?Есть мысли?