В чем проблема со следующим python кодом сервера сокетов? - PullRequest
0 голосов
/ 19 февраля 2020

Почему следующий код сервера не может принимать новые подключения с клиентами даже после закрытия первого подключения?

def bindPort(port):
    global return_response
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        serverSocket.bind(('', port))
    except:
        print("Cannot bind to port. Error: " + str(sys.exc_info))

    serverSocket.listen(2)
    print("The server is ready to receive")
    count = 0
    while True:
        connectionSocket, addr = serverSocket.accept()
        count += 1
        print("Accepted {} connections so far.".format(count))
        print('Connection established from {}'.format(addr))
        while True:
            sentence = connectionSocket.recv(1024)
            if not sentence:
                print("Empty")
                break
            print(sentence)
            #parseIncomingRequest(sentence.decode())
            print(return_response)
            connectionSocket.send(return_response.encode())
            return_response = ''
        print("Closing loop")
        connectionSocket.close() 

1 Ответ

0 голосов
/ 21 февраля 2020

Я прошу прощения за то, что не прочитал вопрос должным образом

1) объявите переменную ответного ответа, прежде чем использовать ее

2) выйдите из второго, пока l oop, если вы хотите принять другое соединение. В вопросе, который вы сказали, что после закрытия сокета не было принято никаких соединений, но для закрытия сокета вы должны выйти из второго, пока l oop. Или, по моему мнению, вы должны удалить второе l oop.

3) если вы хотите продолжать прослушивать сокет и по-прежнему иметь возможность получать другие соединения, используйте модуль потоков

def bindPort(port):
  global return_response
  serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  try:
    serverSocket.bind(('', port))
  except:
    print("Cannot bind to port. Error: " + str(sys.exc_info))

  serverSocket.listen(2)
  print("The server is ready to receive")
  count = 0
  while True:
    connectionSocket, addr = serverSocket.accept()
    count += 1
    print("Accepted {} connections so far.".format(count))
    print('Connection established from {}'.format(addr))
    sentence = connectionSocket.recv(1024)    
    if not sentence:
          print("Empty")
          break
    print(sentence)
     #parseIncomingRequest(sentence.decode())
    return_response = ''
    print(return_response)
    connectionSocket.send(return_response.encode())
    connectionSocket.shutdown(socket.SHUT_RDWR)
    connectionSocket.close() 

4) или если вы хотите оставьте l oop для дальнейшей модификации

import socket

def bindPort(port):
  global return_response
  serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  try:
    serverSocket.bind(('', port))
  except:
    print("Cannot bind to port. Error: " + str(sys.exc_info))

  serverSocket.listen(2)
  print("The server is ready to receive")
  count = 0
  while True:
    connectionSocket, addr = serverSocket.accept()
    count += 1
    print("Accepted {} connections so far.".format(count))
    print('Connection established from {}'.format(addr))
    while True:

        sentence = connectionSocket.recv(1024)
        if not sentence:
            print("Empty")
            break
        print(sentence)
        #parseIncomingRequest(sentence.decode())
        return_response = 'a'
        print(return_response)
        connectionSocket.send(return_response.encode())
        break

    print("Closing loop")
    connectionSocket.shutdown(socket.SHUT_RDWR)
    connectionSocket.close()
...