构造一个有三个重载TcpListener:
public TcpListener(int port);(已过时)public TcpListener(IPEndPoint localEP)public TcpListener(IPAddress localaddr, int port)我想听听一个特定的端口,但在所有可用的接口.还有就是可以做的过载,但它被标记为obsolete.
使用TcpListener.NET 在所有接口上侦听特定端口的新首选/非过时方法是什么?
为了乐于助人,一个IPEndPoint是:
public IPEndPoint(
IPAddress address,
int port
)
Run Code Online (Sandbox Code Playgroud)
这是第三次超载.并且IPAddress作为其构造函数:
byte[]Int64byte[]和一个Int64我们遇到的问题是,当相对较少的节点(16到24,但我们将来需要处理更多)尝试同时连接时,我们的套接字服务器的传入客户端套接字连接被拒绝.
一些细节:
当我们尝试在网格上运行测试时,客户端节点会尝试连接到服务器并发送40-100K数据包然后断开连接.使用16到24个节点,我们开始发现客户端连接无法连接到服务器的问题.鉴于此设置,我们尝试最多可能处理16-24个并发客户端连接并失败,这对我们来说根本不适合.
主服务器循环正在侦听常规SocketServer,当它获得连接时,它会生成一个新的Thread来处理连接,立即返回侦听socket.我们还有一个虚拟的python服务器,只需读取和丢弃传入的数据,以及一个在转储数据之前记录数据的C++服务器,并且两者都遇到同样的问题,客户端无法连接之前有多少成功客户端连接的微小变化失败开始了.这使我们相信任何特定的服务器在这个问题上没有错,而且可能是环境问题.
我们首先想到的是套接字上的TCP积压.即使推到很高的水平,这也没有缓解这个问题.Java SocketServer的默认值为50,远低于我们能够处理的值.
我们在同一子网上的机器之间运行测试,并禁用机器上的所有本地防火墙,以防FW对我们与服务器的连接进行速率限制; 没有成功.
我们尝试在运行服务器的Windows机器上调整网络:
我的感觉是,Windows在某种程度上限制了入站连接的数量,但我们不确定要修改哪些内容以允许更多的连接.网络上代理限制连接速率的想法似乎也不正确.我们高度怀疑同时连接的数量是否会使物理GB网络过载.
我们很难过.有没有其他人遇到这样的问题,并找到了解决方案?
我怎么能叫shutdown()在SocketServer接收到某个消息"退出"之后?据我所知,调用serve_forever()将阻止服务器.
谢谢!
我试图使用BaseHttpServer创建一个http代理,它基于SocketServer,它有2个异步Mixins(ThreadingMixIn和ForkingMixIn)
他们在每个请求上工作的那两个问题(为每个请求分配一个新线程或fork一个新的子进程)
是否有一个Mixin利用一个让我们说4个子进程和每个40个线程的池,所以请求由那些已经创建的线程处理?
因为这会带来巨大的性能提升,我想这会节省一些资源.
python concurrency asyncsocket socketserver python-multithreading
我用python编写了一个服务器程序.
我想要一个字符串,但我只有一个角色!我怎么才能收到一个字符串?
def handleclient(connection):
while True:
rec = connection.recv(200)
if rec == "help": #when I put help in the client program, rec = 'h' and not to "help"
connection.send("Help Menu!")
connection.send(rec)
connection.close()
def main():
while True:
connection, addr = sckobj.accept()
connection.send("Hello\n\r")
connection.send("Message: ")
IpClient = addr[0]
print 'Server was connected by :',IpClient
thread.start_new(handleclient, (connection,))
Run Code Online (Sandbox Code Playgroud) 我正在为我的 Raspberry Pi 编写一个 Python 服务器(带有 SocketServer)。该服务器等待传入的客户端并激活来自该远程连接的任何组件,例如继电器和 LED。这是我的第一个项目,所以我遇到了一些麻烦:
在我的 main 中,我创建对象并发送我想要控制的组件的数组列表;就像领导他自己的所有职能
Server.Server(ComponentList)
while True:
do stuff
Run Code Online (Sandbox Code Playgroud)
在 Server.py 中我启动服务器并设置一些设置
class Server():
def __init__(self, ComponentList):
self.ComponentList = ComponentList
self.current_component = 0
self.server = Socket.ThreadedTCPServer((settings.HOSTNAME,settings.PORT), Socket.ThreadedTCPRequestHandler)
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
self.server.set_componentlist(self.ComponentList)
self.server.set_current_component(self.current_component)
def set_current_component(self, current_component):
self.current_component = current_component
def get_current_component(self):
return self.current_component
def set_componentlist(self, ComponentList):
self.ComponentList = ComponentList
def get_componentlist(self):
return self.ComponentList
Run Code Online (Sandbox Code Playgroud)
最后在 Socket.py 中,我编码了产生错误的真实服务器
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
print "Client connected with ", self.client_address
self.request.send("Insert Password\r\n")
if self.request.recv(1024).strip() …Run Code Online (Sandbox Code Playgroud) 我正在使用 Python 3 中的线程 SocketServer 开发一个“简单”服务器。
为此,我在实施关闭方面遇到了很多麻烦。我在互联网上找到的下面的代码最初可以工作,但在通过 telnet 从客户端发送一些命令后停止工作。一些调查告诉我它挂在 threading._shutdown... threading._wait_for_tstate_lock 中,但到目前为止这还没有敲响警钟。
我的研究告诉我,关于如何在不同的 Python 版本中做到这一点,有大约 42 种不同的解决方案、框架等。到目前为止我找不到 python3 的工作方法。例如,我喜欢python 2.7 的telnetsrv (https://pypi.python.org/pypi/telnetsrv/0.4)(它使用 gevent 中的 greenlets),但这个不适用于 python 3。所以如果有更多 pythonic,std lib 方法或可靠工作的方法我很想听听!
我目前的赌注是使用套接字服务器,但我还不知道如何处理挂起的服务器。我删除了所有日志语句和大部分功能,因此我可以发布这个暴露问题的最小服务器:
# -*- coding: utf-8 -*-
import socketserver
import threading
SERVER = None
def shutdown_cmd(request):
global SERVER
request.send(bytes('server shutdown requested\n', 'utf-8'))
request.close()
SERVER.shutdown()
print('after shutdown!!')
#SERVER.server_close()
class service(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
msg = str(self.request.recv(1024).strip(), 'utf-8')
if msg == 'shutdown':
shutdown_cmd(msg, self.request)
else:
self.request.send(bytes("You …Run Code Online (Sandbox Code Playgroud) 我一直在玩Python的SocketServer:
#!/usr/bin/python
import SocketServer
class EchoHandler(SocketServer.BaseRequestHandler):
def handle(self):
data=self.request.recv(1024)
self.request.send(data)
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), TCPEchoServer)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
通过阅读源代码,我知道作为参数接收并RequestHandler.__init__()在.requestself.request
在哪里可以找到该request对象的规格?
我对如何正确关闭我正在使用的非常简单的服务器感到困惑。
我想这应该足够了:
#!/usr/bin/python
import signal
import myhandler
import SocketServer
def terminate(signal, frame):
print "terminating on %s at %s"
server.shutdown()
if __name__ == "__main__":
signal.signal(signal.SIGTERM, terminate)
server = SocketServer.TCPServer(("localhost", 9999), myhandler.MyHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
服务器工作正常,但是当我向它抛出 SIGTERM 时,它只会打印terminating on 15 at ...但不会真正关闭(即关闭所有套接字并退出)。
现在 pydoc 解释了它
#!/usr/bin/python
import signal
import myhandler
import SocketServer
def terminate(signal, frame):
print "terminating on %s at %s"
server.shutdown()
if __name__ == "__main__":
signal.signal(signal.SIGTERM, terminate)
server = SocketServer.TCPServer(("localhost", 9999), myhandler.MyHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
但这就是我迷失的地方,因为我什至无法理解线程编程。现在我只需要一个简单的 TCP 回显服务器,我可以killall随时启动该服务器(由于剩余的监听套接字而现在失败)。
那么实现这一目标的正确方法是什么?
我正在构建一个HTTPS代理,它可以转发所有SSL通信。这称为透明隧道。无论如何,我对Python的套接字服务器有问题。当我调用rfile.read()时,需要很长时间才能返回。即使我使用select来确保I / O准备就绪,它仍然需要很长时间。通常是30秒,并且客户端的套接字由于超时而关闭。我无法解除套接字的阻塞,因为我需要先读取数据,然后将刚读取的所有数据转发到远程服务器,因此必须首先将其与数据一起返回。
我的代码如下:
import SocketServer
import BaseHTTPServer
import socket
import threading
import httplib
import time
import os
import urllib
import ssl
import copy
from history import *
from http import *
from https import *
from logger import Logger
DEFAULT_CERT_FILE = "./cert/ncerts/proxpy.pem"
proxystate = None
class ProxyHandler(SocketServer.StreamRequestHandler):
def __init__(self, request, client_address, server):
self.peer = False
self.keepalive = False
self.target = None
self.tunnel_mode = False
self.forwardSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Just for debugging
self.counter = 0
self._host = None
self._port …Run Code Online (Sandbox Code Playgroud) socketserver ×10
python ×8
sockets ×5
.net ×1
asyncsocket ×1
concurrency ×1
gevent ×1
java ×1
proxytunnel ×1
python-3.x ×1
request ×1
ssl ×1
tcplistener ×1
windows ×1