Python套接字端口转发

Python套接字端口转发,python,sockets,Python,Sockets,所以我转发了我的ip,这样我的朋友们就可以测试我的东西是否有效 我有一个简单的服务器,托管在内部ip上 import socket import threading class Server: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connections = [] def __init__(self, ip="0.0.0.0", port=5555): self.sock.b

所以我转发了我的ip,这样我的朋友们就可以测试我的东西是否有效

我有一个简单的服务器,托管在内部ip上

import socket
import threading



class Server:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connections = []
    def __init__(self, ip="0.0.0.0", port=5555):
        self.sock.bind((ip, port))
        self.sock.listen(1)

    def handler(self, c, a):
        while True:
            data = c.recv(4096)
            for connection in self.connections:
                connection.send(data)
            if not data:
                print(str(a[0]) + ":" + str(a[1]), "disconnected")
                self.connections.remove(c)
                c.close()
                break

    def run(self):
        while True:
            c, a = self.sock.accept()
            rThread = threading.Thread(target=self.handler, args=(c, a))
            rThread.daemon = True
            rThread.start()
            self.connections.append(c)
            print(str(a[0]) + ":" + str(a[1]), "connected")


host = Server("192.168.x.xxx", 6667)
print("Server status: Running")
host.run()
还有一个简单的客户端模块,我试图将公共ip传递给它

import socket
import pickle
import threading
import pyaudio
import numpy as np

class Client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    def __init__(self, address):
        threading.Thread.__init__(self)

        self.sock.connect((address, 6667))

    def run(self, id):
        RATE = 16000
        CHUNK = 256

        self.id = id

        p = pyaudio.PyAudio()
        player = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, output=True, frames_per_buffer=CHUNK)
        while True:
            data = self.sock.recv(4096)
            data = pickle.loads(data)
            if data[0] != self.id:
                if not data:
                    break
                player.write(np.fromstring(data[1],dtype=np.int16),CHUNK)

    def sendMsg(self, data, id):
        data1 = [id, data]
        self.sock.send(pickle.dumps(data1))
当我尝试为客户端提供公共地址时,客户端没有连接到服务器

print("Connecting to server")
cli = Client("91.242.xxx.xxx")
rThread = threading.Thread(target=cli.run, args=(id,))
rThread.daemon = True
rThread.start()
print("Connected to server")
唯一的输出是连接到服务器


我不知道我做错了什么,也不知道该怎么做才能解决这个问题。我的ISP使用CGNat,我不得不打电话告诉他们我需要一个公共IP,他们很乐意为我这样做。

当我使用内部IP时,一切都很好。你是从内部网络尝试这个吗?我很确定,问题是绑定套接字时正在使用端口5555,而不是稍后使用的端口6677。但我只是浏览了一下你的代码,所以不可能certain@Ben不,当我调用Instance时,它会将端口设置为6667。它似乎与调制解调器或其他东西有关,但与代码无关。