繁体   English   中英

可以连接到本地网络上的套接字,但不能连接到单独的套接字(python 套接字)

[英]Can connect to a socket on my local network but not on separate ones (python sockets)

我一直在尝试制作一个可以让我远程访问计算机的程序。 当两台计算机都连接到同一个网络时,它可以完美运行,并且我可以访问我编写的某种命令行。

我对网络非常缺乏经验,我不完全确定需要什么样的信息。

这是我使用的代码:

服务器:

import sys
import socket

def create_socket():
    try:
        global host
        global port
        global s
        host = ""
        port = 9999
        s = socket.socket()

    except socket.error as msg:
        print("SocketCreationError: " +str(msg))

def bind_socket():
    try:
        global host
        global port
        global s

        print("binding the port " + str(port)+"...")

        s.bind((host,port))
        s.listen(5)

        
    except socket.error as msg:
        print("SocketBindingError: " + str(msg))
        print("retrying...")
        bind_socket()

def socket_accept():
    conn,address = s.accept()
    print("Connection established. \nIP:"+address[0]+"\nPort:"+str(address[1]))
    print(str(conn.recv(1024), "utf-8"), end="")
    send_command(conn)
    conn.close()

#allows user to send command to client computer
def send_command(conn):
    while True:
        try:
            cmd = input(">")
            if cmd == 'exit':
                conn.close()
                s.close()
                sys.exit()
            if len(str.encode(cmd)) > 0:
                conn.send(str.encode(cmd))
                clientResponse = str(conn.recv(1024),"utf-8")
                print(clientResponse, end="")
        except Exception:
            print("Something went wrong...")

def main():
    create_socket()
    bind_socket()
    socket_accept()

main()

客户:

import socket
import os
import subprocess

#connect to socket and send cwd
s = socket.socket()
host = 'myIP'
port = 9999

s.connect((host, port))
s.send(str.encode(os.getcwd()))

#allows form of command line on host pc
while True:
    try:
        data = s.recv(1024)
        outputStr = ""
        
        if data.decode("utf-8") == 'dir':
            dirList = os.listdir(os.getcwd())
            
            for i in dirList:
                print(i)
                outputStr = outputStr + i + "\n"
                
        elif data[:2].decode("utf-8") == 'cd':
            dirTo = data[3:].decode("utf-8")
            print(data[3:].decode("utf-8"))
            os.chdir(os.getcwd() + "\\" + dirTo)
        elif len(data) > 0:
            cmd = subprocess.Popen(data.decode("utf-8"), shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE, stderr=subprocess.PIPE)
            outputByte = cmd.stdout.read() + cmd.stderr.read()
            outputStr = str(outputByte, "utf-8")
            print(outputStr)
            
        cwd = os.getcwd()
        s.send(str.encode(outputStr +"\n"+cwd))

#handle something going wrong and just allows to continue
    except Exception:
        cwd = os.getcwd()
        s.send(str.encode("Something went wrong...\n"+ cwd))

我正在使用 ipv4 地址。 我认为这可能与服务器端的端口转发有关,但我又不确定?

感谢您提前提供任何答案:)

由于端口转发,您无法使用远程网络连接到您的计算机。 如果您不知道那是什么,我建议您看一下 Wikipedia 上的文章: https://en.wikipedia.org/wiki/Port_forwarding执行端口转发的方法有很多种,其中最简单的是 UPnP /IGD(查找),但如果您只是对能够远程访问您的计算机感兴趣,您可以使用 SSH(安全 Shell 连接)来做到这一点(我认为它也适用于远程网络) . 如果您使用的是 Linux,这应该很容易设置,只需查看如何设置即可。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM