def launch_d3po(path): """Start a server to view an exported D3PO bundle, and open a browser. :param path: The TLD of the bundle """ from socketserver import TCPServer from http.server import SimpleHTTPRequestHandler from random import randrange from socket import error import webbrowser from threading import Thread os.chdir(path) while True: try: PORT = randrange(8000, 9000) server = TCPServer(("", PORT), SimpleHTTPRequestHandler, False) server.allow_reuse_address = True server.server_bind() break except error: # port already taken pass print('Serving D3PO on port 0.0.0.0:%i' % PORT) server.server_activate() thread = Thread(target=server.serve_forever) thread.setDaemon(True) # do not prevent shutdown thread.start() webbrowser.open('http://0.0.0.0:%i' % PORT)
def server_bind(self): if utils.OsInterfaceIsSupported(): try: self.socket.setsockopt(socket.SOL_SOCKET, 25, responder_settings.Config.Bind_To+'\0') except: pass TCPServer.server_bind(self)
def _start_web_server(): global http_server from http.server import SimpleHTTPRequestHandler from socketserver import TCPServer try: if need_chdir: os.chdir(root) handler = SimpleHTTPRequestHandler else: handler = partial(SimpleHTTPRequestHandler, directory=root) http_server = TCPServer(("", 8000), handler, bind_and_activate=False) http_server.daemon_threads = True http_server.allow_reuse_address = True http_server.server_bind() http_server.server_activate() http_server_ready.set() http_server.serve_forever() except: import traceback traceback.print_exc() finally: http_server = None http_server_ready.set() if need_chdir: os.chdir(curr_dir)
def change_socket_configuration(): """ 设置参数 bind_and_activate=False 来修改 socket 参数 设置参数 TCPServer.allow_reuse_address = True, 来允许服务器重新绑定一个 之前使用过的端口号 TCPServer.allow_reuse_address = True serv = TCPServer(('', 20000), EchoHandler) serv.serve_forever() :return: """ from socketserver import TCPServer from socketserver import BaseRequestHandler from socket import socket class EchoHandler(BaseRequestHandler): def handle(self): print('Got connection from', self.client_address) while True: msg = self.request.recv(8192) print('---receive client message:----', msg) if not msg: break self.request.send(msg) serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False) # Set up various socket options serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # Bind and activate serv.server_bind() serv.server_activate() serv.serve_forever()
class tcp_server(threading.Thread): def __init__(self, port): super().__init__() self.serv = None self.port = port def run(self): self.serv = TCPServer( ('', self.port), SeverHandler, bind_and_activate=False) self.serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # Bind and activate self.serv.server_bind() self.serv.server_activate() self.serv.serve_forever() def send_data(self, data): ''' Args: data: bytes data ''' if self.is_alive(): for client in client_socket: client.sendall(data) def shutdown(self): shutting_flag[0] = True self.serv.socket.close() self.serv.shutdown() self.serv.server_close()
class TCPCommandListener(threading.Thread): """ This listener is to use a SocketServer.TCPServer on the logic for listening commands the advantage of this version is that is basically a server shipped with python so more error prone. It requires the implementation of a Handler class which will contain all the handshaking logic that was implemented on the original SocketServer (below). There's a specific TODO on this version: need to find the way to tell the server to stop once the command execution has completed. """ def __init__(self, output_handler): threading.Thread.__init__(self) self.handshake = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8)) self.close_key = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8)) self._server = TCPServer(('127.0.0.1', 0), lambda r, c, s: HandShakeHandler(r, c, s, (self.handshake, self.close_key), output_handler), False) self._server.server_bind() self.port = self._server.server_address[1] def run(self): self._server.server_activate() self._server.serve_forever()
def server_bind(self): TCPServer.server_bind(self) # change socket permissions os.chmod(self.server_address, 0o0660) # TODO: fix mode parsing from arguments self.server_name = "healthd" self.server_port = 0
def test_bind_and_activate(): ''' 通常情况下创建实例同时顺便激活。在此处,创建实例过后并没有立刻激活,而且进行相应的绑定设置,然后激活,最后阻塞提供服务 ''' serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False) serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) serv.server_bind() serv.server_activate() serv.serve_forever()
def server_bind(self) -> None: if dualstack_ipv6: self.socket.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0) TCPServer.server_bind(self) if isinstance(binding, PurePath): self.server_name = self.socket.getsockname() elif isinstance(binding, tuple): self.server_name = getfqdn().encode("idna").decode() if isinstance(self, HTTPServer): _, actual_port, *_ = self.socket.getsockname() self.server_port = actual_port else: never(binding)
def server_bind(self): """ Override server_bind to store the server name, even in IronPython. See https://ironpython.codeplex.com/workitem/29477 """ TCPServer.server_bind(self) host, port = self.socket.getsockname()[:2] self.server_port = port try: self.server_name = socket.getfqdn(host) except ValueError: # Use the local host name in case of error, like CPython does self.server_name = socket.gethostname()
def server_bind(self): """Override of TCPServer.server_bind() that tracks bind-time assigned random ports.""" TCPServer.server_bind(self) _, self.server_port = self.socket.getsockname()[:2]
def server_bind(self): """Override server_bind to store the server name.""" TCPServer.server_bind(self) host, port = self.server_address[:2] self.server_name = socket.getfqdn(host) self.server_port = port
from socketserver import StreamRequestHandler, TCPServer class EchoHandler(StreamRequestHandler): def handle(self): print('Got connection from', self.client_address) # self.rfile is a file-like object for reading for line in self.rfile: # self.wfile is a file-like object for writing self.wfile.write(line) if __name__ == '__main__': import socket serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False) # Set up various socket options serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # Bind and activate serv.server_bind() serv.server_activate() print('Echo server running on port 20000') serv.serve_forever()
NWORKERS = 16 serv = TCPServer(('', 20000), EchoHandler) for n in range(NWORKERS): t = Thread(target=serv.serve_forever) t.daemon = True t.start() serv.serve_forever() # 一 般 来 讲, 一 个 TCPServer 在 实 例 化 的 时 候 会 绑 定 并 激 活 相 应 的 socket # 。不过,有时候你想通过设置某些选项去调整底下的 socket‘ ,可以设置参数 # bind and activate=False 。如下: if __name__ == '__main__': serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False) # Set up various socket options serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # Bind and activate serv.server_bind() serv.server_activate() serv.serve_forever() # 上面的 socket 选项是一个非常普遍的配置项,它允许服务器重新绑定一个之前使 # 用过的端口号。由于要被经常使用到,它被放置到类变量中,可以直接在 TCPServer # 上面设置。在实例化服务器的时候去设置它的值,如下所示: if __name__ == '__main__': TCPServer.allow_reuse_address = True serv = TCPServer(('', 20000), EchoHandler) serv.serve_forever() # 在上面示例中,我们演示了两种不同的处理器基类(BaseRequestHandler 和 # StreamRequestHandler )。 StreamRequestHandler 更加灵活点,能通过设置其他 # 的类变量来支持一些新的特性。比如 import socket
import socket NUM_WORKERS = 16 class EchoHandler(StreamRequestHandler): timeout = 5 rbufsize = -1 wbufsize = 0 disable_nagle_algorithm = False def handle(self): print("got connection from:", self.client_address) try: for line in self.rfile: self.wfile.write(line) except socket.timeout: print("timed out for connection:", self.client_address) if __name__ == "__main__": server = TCPServer(("", 20000), EchoHandler, bind_and_activate=False) server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) server.server_bind() server.server_activate() for i in range(NUM_WORKERS): t = threading.Thread(target=server.serve_forever, daemon=True) t.start() server.serve_forever()
def server_bind(self): TCPServer.server_bind(self)
def server_bind(self): TCPServer.server_bind(self) self.server_name = "daemon_http_server" self.server_port = 0