在套接字服务器运行时运行单独的代码?
Posted
技术标签:
【中文标题】在套接字服务器运行时运行单独的代码?【英文标题】:Running separate code while a socket server is running? 【发布时间】:2011-11-17 07:00:37 【问题描述】:如何让一个套接字服务器在运行时接受传入连接并处理该部分代码,同时又不让代码等待新连接卡在同一个循环中?
我刚刚开始尝试学习。 TCP 处理程序有用吗?
我只需要一些关于这个主题的简单例子。我想要在服务器中有一个命令部分。所以我可以在服务器运行时做一些事情。
编辑:我正在尝试做的事情:
1 - TCP server for multiple clients
2 - Respond to more than one at a time when needed
3 - Text input availability at all time, to be used for getting/setting info
4 - A simple way to get/save client address info. Currently using a list to save them.
【问题讨论】:
“哈哈。”?什么?你不如从“改写得更好”开始,而不是等我们问。段落有帮助。步骤和顺序有帮助。有时代码示例会有所帮助。 “哈哈。”没有帮助。 对不起,我只是不知道如何准确地说出来。而且我没有任何例子,因为我不知道从哪里开始。我只是不确定如何让服务器在循环中监听连接。但仍然能够让服务器查找我可能想要放入 cmd 窗口的任何输入,并据此采取行动。 (1) 请大写“I”。 (2) 去掉“哈哈”。 (3) 一步一步地写下你认为你的服务器应该做什么。使用单独的段落。给步骤编号。做一些事情来解释你认为应该发生的事情。我们无法猜测。 (4) 拼写检查。例如,“分离”。 已更新,希望对澄清事情有所帮助。 试图为你清理一些。请了解如何正确使用您的 shift 键和添加分段符,并记住您不是在这里发短信或与您的朋友聊天。 “哈哈”和“我是”和“大声笑”和不必要的“所以我只是想也许可以”糟糕的语法、措辞和引号只会让事情变得更难阅读,因此人们更难帮助你。 :) 【参考方案1】:您可以在thread 中运行您的套接字服务器。
import threading
import SocketServer
server = SocketServer.TCPServer(('localhost', 0), SocketServer.BaseRequestHandler)
th = threading.Thread(target=server.serve_forever)
th.daemon = True
th.start()
【讨论】:
所以,如果我有一个线程服务器。就像在线游戏一样,我可以有一个线程供玩家连接。还有另一个用于命令输入的线程?我刚刚读到每个连接使用线程是不好的。那么为所有客户端使用 1 个线程会起作用吗? 在上面的示例中,只有sever.serve_forever
循环将在线程中运行,以便您的脚本可以继续执行,而在后台有一个服务器正在侦听新连接。您还可以查看文档:docs.python.org/library/socketserver.html 以了解如何创建线程服务器(为每个请求分叉一个新线程)或分叉服务器(为每个请求创建一个新进程)...,或者甚至更好看看twisted (twistedmatrix.com/trac) 它可以帮助你创建一个无阻塞服务器,希望我能回答你的问题:)
我假设每个线程都可以有自己的循环,对吧?如果是这样,那正是我正在寻找的。似乎线程有点像在一个运行多个脚本。
线程是并行处理,因此代码中的一个进程不会阻塞另一个进程。如果您正在为游戏执行此操作,则最好使用处理 TCP 连接的包/模块。我敢肯定扭曲是可能的,因为它应该用于网络/互联网应用程序。但是我自己没用过twisted。【参考方案2】:
Python 在 asyncore
模块 (http://docs.python.org/library/asyncore.html) 中内置了对异步套接字处理的支持。
异步套接字处理意味着您必须在您的代码(主循环)中执行至少一次套接字处理循环迭代:
asyncore.loop(count=1)
来自文档的示例:
import asyncore
import socket
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(8192)
if data:
self.send(data)
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
def handle_accept(self):
pair = self.accept()
if pair is None:
pass
else:
sock, addr = pair
print('Incoming connection from %s' % repr(addr))
handler = EchoHandler(sock)
server = EchoServer('localhost', 8080)
# Note that here loop is infinite (count is not given)
asyncore.loop()
每次套接字接受连接时handle_accept
都会被循环调用。每次可以从套接字读取数据时,都会调用handle_read
,依此类推。
您可以通过这种方式同时使用 TCP 和 UDP 套接字。
【讨论】:
与普通的套接字 TCP 服务器相比,这对于游戏环境来说会更好吗? 普通的TCP服务器是什么意思?顺便提一句。异步套接字处理具有不涉及任何线程处理的巨大优势。【参考方案3】:我不确定您要问什么,但通常在服务器端,您会调用 socket()、bind() 和 listen() 来设置套接字,然后循环调用 accept()。在建立客户端连接之前,此 accept() 调用会阻塞。
对于简单的服务器,您可以处理客户端在循环中发出的任何请求。对于现实世界的服务器,您需要生成一些其他机制(例如,新线程或进程,取决于语言/平台)来异步处理请求,以便原始循环可以在 accept() 调用上再次迭代并继续回到监听连接。
有关更多信息和 Python 示例,请参阅 Python 套接字文档:
http://docs.python.org/howto/sockets.html
【讨论】:
以上是关于在套接字服务器运行时运行单独的代码?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 10 上本地运行 Python 2.7 Web 服务时禁止访问套接字消息
在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率