socket.accept принимает 2 соединения - PullRequest
0 голосов
/ 08 июня 2018

У меня есть связь между сервером и клиентом, организованная через библиотеку сокетов в 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

Наверное, главный вопрос: что происходит?Есть мысли?

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