标签: socketserver

TcpListener:如何监听所有接口上的特定端口?

构造一个有三个重载TcpListener:

听听一个特定的端口,但在所有可用的接口.还有就是可以做的过载,但它被标记为obsolete.

使用TcpListener.NET 在所有接口上侦听特定端口的新首选/非过时方法是什么?


为了乐于助人,一个IPEndPoint是:

public IPEndPoint(
    IPAddress address,
    int port
)
Run Code Online (Sandbox Code Playgroud)

这是第三次超载.并且IPAddress作为其构造函数:

  • 一个 byte[]
  • 一个 Int64
  • 一个byte[]和一个Int64

.net sockets tcplistener socketserver

8
推荐指数
1
解决办法
1万
查看次数

客户端套接字连接被Windows主机上的服务器拒绝为小数(16 <x <24)的同时客户端连接尝试

我们遇到的问题是,当相对较少的节点(16到24,但我们将来需要处理更多)尝试同时连接时,我们的套接字服务器的传入客户端套接字连接被拒绝.

一些细节:

  • 服务器正在Windows 2008或7上运行
  • 我们的主服务器是使用ServerSocket用Java编写的
  • 客户端也是在我们数据中心的网格节点上运行的Windows

当我们尝试在网格上运行测试时,客户端节点会尝试连接到服务器并发送40-100K数据包然后断开连接.使用16到24个节点,我们开始发现客户端连接无法连接到服务器的问题.鉴于此设置,我们尝试最多可能处理16-24个并发客户端连接并失败,这对我们来说根本不适合.

主服务器循环正在侦听常规SocketServer,当它获得连接时,它会生成一个新的Thread来处理连接,立即返回侦听socket.我们还有一个虚拟的python服务器,只需读取和丢弃传入的数据,以及一个在转储数据之前记录数据的C++服务器,并且两者都遇到同样的问题,客户端无法连接之前有多少成功客户端连接的微小变化失败开始了.这使我们相信任何特定的服务器在这个问题上没有错,而且可能是环境问题.

我们首先想到的是套接字上的TCP积压.即使推到很高的水平,这也没有缓解这个问题.Java SocketServer的默认值为50,远低于我们能够处理的值.

我们在同一子网上的机器之间运行测试,并禁用机器上的所有本地防火墙,以防FW对我们与服务器的连接进行速率限制; 没有成功.

我们尝试在运行服务器的Windows机器上调整网络:

  • 减少TimedWaitDelay,但没有效果(在我的Python测试中它不应该因为该测试只运行几毫秒).
  • 将MaxUserPort增加到一个大值,大约65000,但没有效果(这是奇怪的,因为我的Python测试只发送240条消息,所以我甚至不应该接近这种类型的限制).
  • 将TcpNumConnection增加到一个较大的值(不记得确切的数字).同样,我们一次不应该有超过24个连接,所以这不是一个限制.
  • 启动"动态积压"功能,允许消息积压动态增加.我认为我们将最大值设置为2000连接,最小1000个连接,但没有效果.同样,Python永远不应该超过240个连接,所以我们不应该甚至激活动态积压.
  • 除了以上禁用TCP端口的Windows"自动调整".再一次,没有效果.

我的感觉是,Windows在某种程度上限制了入站连接的数量,但我们不确定要修改哪些内容以允许更多的连接.网络上代理限制连接速率的想法似乎也不正确.我们高度怀疑同时连接的数量是否会使物理GB网络过载.

我们很难过.有没有其他人遇到这样的问题,并找到了解决方案?

java sockets windows socketserver windows-networking

7
推荐指数
1
解决办法
1319
查看次数

Python SocketServer

我怎么能叫shutdown()SocketServer接收到某个消息"退出"之后?据我所知,调用serve_forever()将阻止服务器.

谢谢!

python sockets socketserver

6
推荐指数
2
解决办法
3627
查看次数

SocketServer有ThreadingMixIn和ForkingMixIn的任何池吗?

我试图使用BaseHttpServer创建一个http代理,它基于SocketServer,它有2个异步Mixins(ThreadingMixIn和ForkingMixIn)

他们在每个请求上工作的那两个问题(为每个请求分配一个新线程或fork一个新的子进程)

是否有一个Mixin利用一个让我们说4个子进程和每个40个线程的池,所以请求由那些已经创建的线程处理?

因为这会带来巨大的性能提升,我想这会节省一些资源.

python concurrency asyncsocket socketserver python-multithreading

6
推荐指数
2
解决办法
4453
查看次数

仅从套接字接收一个字节

我用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)

python sockets socketserver

6
推荐指数
1
解决办法
3876
查看次数

具有多个请求的 SocketServer Python

我正在为我的 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 sockets multithreading request socketserver

6
推荐指数
0
解决办法
935
查看次数

基于 socketserver 的 Python 3 服务器关闭挂起

我正在使用 Python 3 中的线程 SocketServer 开发一个“简单”服务器。

为此,我在实施关闭方面遇到了很多麻烦。我在互联网上找到的下面的代码最初可以工作,但在通过 telnet 从客户端发送一些命令后停止工作。一些调查告诉我它挂在 threading._shutdown... threading._wait_for_tstate_lock 中,但到目前为止这还没有敲响警钟。

我的研究告诉我,关于如何在不同的 Python 版本中做到这一点,有大约 42 种不同的解决方案、框架等。到目前为止我找不到 python3 的工作方法。例如,我喜欢python 2.7 的telnetsrvhttps://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 gevent socketserver python-3.x

6
推荐指数
2
解决办法
5671
查看次数

Python SocketServer.TCPServer 请求

我一直在玩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对象的规格?

python socketserver

5
推荐指数
1
解决办法
3066
查看次数

关闭 SIG* 上的 SocketServer

我对如何正确关闭我正在使用的非常简单的服务器感到困惑。

我想这应该足够了:

#!/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随时启动该服务器(由于剩余的监听套接字而现在失败)。

那么实现这一目标的正确方法是什么?

python multithreading socketserver

5
推荐指数
1
解决办法
3512
查看次数

SocketServer rfile.read()非常慢

我正在构建一个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)

python ssl http-tunneling socketserver proxytunnel

5
推荐指数
1
解决办法
808
查看次数