python SocketServer.BaseRequestHandler知道端口并使用已打开的端口
这是我玩的代码,但每次我犯了错误,我都无法重新启动它。 它告诉我端口/套接字已被使用 这是第一个问题 第二个在我的MytPhandler中我怎么知道使用的端口? 这是我的密码: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
# 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
。若你们并没有看到,那个么当那个端口上并没有任何东西在监听时,你们仍然可以得到正在使用的地址。