Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python SocketServer.BaseRequestHandler知道端口并使用已打开的端口_Python_Sockets_Port_Socketserver - Fatal编程技术网

python SocketServer.BaseRequestHandler知道端口并使用已打开的端口

python SocketServer.BaseRequestHandler知道端口并使用已打开的端口,python,sockets,port,socketserver,Python,Sockets,Port,Socketserver,这是我玩的代码,但每次我犯了错误,我都无法重新启动它。 它告诉我端口/套接字已被使用 这是第一个问题 第二个在我的MytPhandler中我怎么知道使用的端口? 这是我的密码: # MetaProject v 0.2 # -*- coding: utf-8 -*- """ Thanks to : People from irc : Flox,Luyt People from stack Overflow : Philippe Leybaert,Platinum Azure,methodin,Su

这是我玩的代码,但每次我犯了错误,我都无法重新启动它。 它告诉我端口/套接字已被使用 这是第一个问题 第二个在我的MytPhandler中我怎么知道使用的端口? 这是我的密码:

# MetaProject v 0.2
# -*- coding: utf-8 -*-
"""
Thanks to :
People from irc :
Flox,Luyt
People from stack Overflow :
Philippe Leybaert,Platinum Azure,methodin,Suresh Kumar,S.Lott,MatTheCat,
kevpie,Ignacio Vazquez-Abrams,adamk,Frédéric Hamidi,THC4k,THC4k,Blam
"""
import SocketServer
import threading

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024)
        socket = self.request
        print "%s wrote:" % self.client_address[0]
        print self.data
        print self.__dict__
        socket.sendto(self.data.upper(), self.client_address)


def serve_thread(host, port):
    server = SocketServer.TCPServer((host, port), MyTCPHandler)
    server.serve_forever()





if __name__ == "__main__":
    threading.Thread(target=serve_thread,args=('localhost', 1238)).start()
    threading.Thread(target=serve_thread,args=('localhost', 1237)).start()
    print "toto"
我已经做了:

def serve_thread(host, port):
    if port == 1858 :
        server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True)
    elif port == 1958 :
        server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True)
    server.allow_reuse_address=True
    server.serve_forever()
但它不起作用。
关于

在调用构造函数时使用
bind\u和\u activate=True创建SocketServer

然后设置
server.allow\u reuse\u address=True

如果要区分这两个端口,可以为请求处理程序使用两个不同的类

编辑

将代码修改为如下所示:

def serve_thread(host, port):
    if port == 1858 :
        server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True)
    elif port == 1958 :
        server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True)
    server.allow_reuse_address=True
    server.server_bind()
    server.server_activate()
    server.serve_forever()
创建自己的服务器类可能更干净。大概是这样的:

class ReuseAddrServer(SocketServer.TCPServer):
    def __init__(self, (host, port)):
        SocketServer.TCPServer.__init__(self, (host, port), bind_and_activate=False)
        self.allow_reuse_address = True
        self.server_bind()
        self.server_activate()

实际上比这更简单——您可以将其设置为类变量,而不是重写init。例如:

class MyServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    allow_reuse_address = True

请你再具体一点好吗?请你再具体一点好吗?我可以让:def serve_thread(host,port):if port==1858:server=SocketServer.TCPServer((host,port),Serverhttp,bind_and_activate=True)elif port==1958:server=SocketServer.TCPServer((host,port),serversmtpt,bind_and_activate=True)server.allow_重用地址=True服务器。永远服务()@用户462794:什么不起作用?您已将此答案标记为已接受,因此如果您仍有问题,请告诉我。我猜您的意思是在
修改您的代码使其看起来像
之后
bind_and_activate=False
(而不是
True
)。您可以使用
strace-f-e trace=network./您的服务器命令
验证是否发生了正确的事情。找一行写着
setsockopt(3,SOL\u SOCKET,SO\u REUSEADDR[1],4)=0
。若你们并没有看到,那个么当那个端口上并没有任何东西在监听时,你们仍然可以得到正在使用的地址。