当前位置: 首页 > 面试题库 >

在python中使用SocketServer框架创建多线程服务器

易俊驰
2023-03-14
问题内容
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
sys.dont_write_bytecode = True
import shlex
import subprocess
import SocketServer

sess = []

class TCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        global sess
        sess.append(self.request)
        ip,port = self.client_address
        print "#%d: client %s:%d"%(len(sess),ip,port)
        while True:
            cmd = self.request.recv(8192)
            out = subprocess.check_output(shlex.split(cmd),stderr=subprocess.STDOUT,shell=True)
            self.request.send(out)
        self.request.close()
class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer): pass

if __name__ == "__main__":
    port = 4242
    svr = ThreadedTCPServer(("",port),TCPHandler)
    print ":%d"%port
    svr.serve_forever()

问题答案:

它比您想象的简单得多:

class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer): pass

比起您,您只需要使用新ThreadedTCPServer的即可TCPServer

有关更多信息,您可以阅读一些文档。

但是,在您的代码中您犯了一些错误:

  1. target参数必须是一个callable对象不是“已调用”对象。
  2. 要处理许多请求,您需要构建一个线程池。如果仅使用一个线程,则它是主线程还是“子”线程没有任何区别。


 类似资料:
  • Server Types Server Objects Implementing a Server Request Handlers Echo Example # socketserver_echo.py import logging import sys import socketserver logging.basicConfig(level=logging.DEBUG,

  • 在前面几篇文章中都是使用同步方式来调用WebService。也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽然很直观,但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这样用户是无法忍受的。 当然我们很容易就可以想到解决问题的方法,这就是多线程。解决问题的基

  • 本文向大家介绍Python使用socketServer包搭建简易服务器过程详解,包括了Python使用socketServer包搭建简易服务器过程详解的使用技巧和注意事项,需要的朋友参考一下 官方提供了socketserver包去方便我们快速的搭建一个服务器框架。 server类 socketserver包提供5个Server类,这些单独使用这些Server类都只能完成同步的操作,他是一个单线程的

  • 我有一个服务层类,它有annotation@Controller和我在线程中生成的服务调用,它正在更新数据库中的某些内容。我在thread的方法中使用了@transaction注释。但我遇到了hibernate异常“找不到会话”。我需要为线程添加任何注释吗? lient.runHibernateException:在lient.java:222没有找到当前线程的Session 4. SpringS

  • 问题内容: 我正在尝试在python中创建多线程Web服务器,但是它一次只响应一个请求,我不知道为什么。你能帮我吗? 问题答案: 在Doug Hellmann的博客中查看此帖子。

  • 问题内容: 我使用python的threding模块创建了一个简单的多线程tcp服务器。每次连接新客户端时,该服务器都会创建一个新线程。 然后,我打开了两个新的终端,并使用netcat连接到服务器。然后,当我使用连接的第一个终端输入并向服务器发送第一个数据时,来自服务器的答复将传到另一个终端,并且第一个连接断开。我猜到了原因,但我怀疑是否会发生这种情况,因为 clientsock 变量被覆盖,因此