Подключение клиента TCP к моему серверу с внешнего IP - PullRequest
0 голосов
/ 08 февраля 2019

Я сделал простой TCP-сервер и клиент на Python.Все работает нормально, когда я использую локальный IP сервера, но не с публичным IP.Мой сервер имеет статический IP-адрес и привязан к этому IP-адресу и порту, и клиент пытается подключиться к общедоступному IP-адресу с тем же портом.Я настроил переадресацию портов на моем маршрутизаторе, чтобы якобы перенаправлять трафик на этот порт на локальный IP-адрес сервера.Маршрутизатор представляет собой Netgear X4S R7800.

Ни сервер, ни клиент не выходят из строя в любой момент.В конечном итоге клиент просто отключается и выдает исключение, а сервер, похоже, вообще не получает никакого соединения.

Server.py

from socket import *
SERVER_NAME = '192.168.1.140' #My server's (static) local IP
SERVER_PORT = 12100

def initializeServer():
    serverSocket = socket(AF_INET, SOCK_STREAM)
    serverSocket.bind((SERVER_NAME, SERVER_PORT))
    serverSocket.listen(5)
    print("Server initialized to port " + str(SERVER_PORT) +"...")
    return serverSocket

def serverLoop(serverSocket):
    while True:
        connectionSocket, addr = serverSocket.accept() #Gets stuck here
        print("Connected to", addr)
        listenToClient(connectionSocket)
        print("Terminating client connection ...")
        connectionSocket.close()

if __name__ == '__main__':
    serverSocket = initializeServer()
    try:
        serverLoop(serverSocket)
    except KeyboardInterrupt:
        shutdownServer(serverSocket)
        print("\nServer shut down")

Client.py

import socket
SERVER_NAME = '193.91.XXX.XXX'  #Public IP
SERVER_PORT = 12100

def connectToServer(serverName, serverPort):
    clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSocket.connect((serverName, serverPort)) #Gets stuck here and eventually times out
    return clientSocket

def main():
    try:
        serverSocket = connectToServer(SERVER_NAME, SERVER_PORT)
    except Exception as e:
        print("Cannot connect to the server\n", e)
    else:
        print("Connected to server")
        try:
            askForUserAction(serverSocket)
        except KeyboardInterrupt:
            serverSocket.close()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 09 февраля 2019

Хорошо, я решил это.Мой модем, предоставляемый моим провайдером, по-видимому, также является маршрутизатором.У меня есть другой маршрутизатор, и я был подключен и перенаправил порты с этого.Просто пришлось изменить настройку роутера моего провайдера и все заработало нормально.

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