使用套接字和端口转发连接不同网络中的两台计算机

时间:2020-06-02 05:39:49

标签: sockets networking port portforwarding

我已经建立了一个简单的客户端-服务器通信代码,当我的计算机本身充当服务器和客户端时,它在我的计算机中运行良好。 现在,我试图在不同网络(不同位置)的两台不同计算机上运行相同的代码,我的计算机将充当服务器,而朋友的计算机将充当客户端。

我已经在路由器以及我朋友的路由器中为我们尝试通信的端口进行了端口转发。我们俩都在路由器后面的内部网络中设置了静态IP。我们俩都在运行代码时关闭了防火墙。

我正在木星笔记本上运行我的代码,我的朋友也是如此。

这是我的服务器代码:

import socket
import threading

HEADER = 64                                              
PORT = 5064
SERVER  = '0.0.0.0'
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE =  "quit"
Receive_from_client = "get info"

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
server.bind(ADDR)

def handle_client(conn, addr):

    print("\n" + f"[NEW Connection] detected from IP: {addr[0]} & Port:{addr[1]} ")
    conn.send(f"connected to server {ADDR}".encode(FORMAT))
    connected =True

    while connected:
        msg_length = conn.recv(HEADER).decode(FORMAT)    # decode the msg from byte to utf-8 format

        if msg_length:
            msg_length = int(msg_length)
            msg = conn.recv(msg_length).decode(FORMAT)

            if msg == DISCONNECT_MESSAGE:
                connected = False
                print(f" [Client][{addr}] {msg}")
                print("Your session is disconnected")
                break

            if msg == Receive_from_client:
                print("\n" + f"Send your msg to client with IP: {addr[0]}")
                thread = threading.Thread(target = send2client, args = (conn, addr))
                thread.start()

            print(f" [Client][{addr}] {msg}")
            conn.send(f"Msg received by server with IP:{addr[0]}".encode(FORMAT))

    conn.close()
    server.close()

def start():
    server.listen()
    print("\n"+ f"[LISTENING] Server is listening from IP: {SERVER} ")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target = handle_client, args = (conn, addr))
        thread.start()

这是客户端代码

import socket
import threading

HEADER = 64 
PORT = 5064
FORMAT = 'utf-8'
DISCONNECT_MESSAGE =  "quit"
SERVER = '103.192.207.250'         # SERVERS public IP
ADDR = (SERVER, PORT)

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(ADDR)

def send2server():
    while True:
        msg = input()                        
        message = msg.encode(FORMAT)
        msg_lenght = len(message)
        send_length = str(msg_lenght).encode(FORMAT)
        send_length += b' '*(HEADER - len(send_length))
        client.send(send_length)
        client.send(message)
        print(client.recv(2048).decode(FORMAT))

        if msg == DISCONNECT_MESSAGE:
            print("session closed")
            client.close()


def start():
    print("\n"+ f"[LISTENING] client is listening from IP: {ADDR} ")
    send2server()

我通过打开Windows防火墙防御程序并选择新的入站和出站规则来打开5064 TCP端口来打开端口。

但仍然,代码不起作用。

我的服务器一直在等待连接,运行几秒钟后客户端出现此错误:

TCP error code 10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

即使我的服务器从端口5064侦听时,当我扫描该端口以检查该端口是否为打开状态时,也都显示为关闭。

我如何检查转发的端口是否确实打开,以及如何使该端口正常工作?

我已经尝试了所有这一切,如果还有其他我想念的东西,请告诉。在过去三天里,我都在努力工作。

0 个答案:

没有答案