标签: socketserver

socket.error:[Errno 10013]尝试以其访问权限禁止的方式访问套接字

我正在尝试使用Windows 7上的Python 2.6.5创建自定义TCP堆栈,以在本地端口80上提供有效的http页面请求.但是,我遇到了似乎Windows 7收紧安全性的问题.此代码适用于Vista.

这是我的示例代码:

import SocketServer
import struct

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        headerText = """HTTP/1.0 200 OK
                        Date: Fri, 31 Dec 1999 23:59:59 GMT
                        Content-Type: text/html
                        Content-Length: 1354"""
        bodyText = "<html><body>some page</body></html>"
        self.request.send(headerText + "\n" + bodyText)

if __name__ == "__main__":
    HOST, PORT = "localhost", 80
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

C:\ python> python TestServer.py Traceback(最近一次调用最后一次):
文件"TestServer.py",第19行,在server = SocketServer.TCPServer((HOST,PORT),MyTCPHandler)文件"C:\ Python26\lib\SocketServer.py",第400行,在init self.server_bind()文件"C:\ Python26\lib\SocketServer.py",第411行,在server_bind中自我.socket.bind(self.server_address)文件"",行1,在绑定中

socket.error:[Errno 10013]尝试以其访问权限禁止的方式访问套接字

我究竟如何在Windows 7上使用它?

[编辑于2010年5月5日@ 2344 PDT]此答案解释了该错误是由于在访问低于1024的端口时需要提升/超级用户权限.我将尝试使用更高的端口号来查看是否存在作品.但是,我仍然想知道为什么我的本地管理员帐户无法访问端口80.

python sockets compatibility windows-7 socketserver

30
推荐指数
7
解决办法
13万
查看次数

使用python socketserver如何将变量传递给处理程序类的构造函数

我想将我的数据库连接传递给EchoHandler类,但我根本无法弄清楚如何执行此操作或访问EchoHandler类.


class EchoHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        print self.client_address, 'connected'

if __name__ == '__main__':
    conn = MySQLdb.connect (host = "10.0.0.5", user = "user", passwd = "pass", db = "database")

    SocketServer.ForkingTCPServer.allow_reuse_address = 1

    server = SocketServer.ForkingTCPServer(('10.0.0.6', 4242), EchoHandler)

    print "Server listening on localhost:4242..."
    try:
        server.allow_reuse_address
        server.serve_forever()
    except KeyboardInterrupt:
        print "\nbailing..."

python socketserver python-2.7

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

在单线程Python应用程序中关闭socketserver serve_forever()

我知道socketserver有一个方法shutdown()导致服务器关闭但这只适用于多线程应用程序,因为需要从运行serve_forever()的线程以外的线程调用shutdown.

我的应用程序一次只处理一个请求所以我不使用单独的线程来处理请求,我无法调用shutdown(),因为它会导致死锁(它不在文档中,但它直接在socketserver的源代码中声明).

我会在这里粘贴我的代码的简化版本以便更好地理解:

import socketserver

class TCPServerV4(socketserver.TCPServer):
  address_family = socket.AF_INET
  allow_reuse_address = True

class TCPHandler(socketserver.BaseRequestHandler):
  def handle(self):
    try:
       data = self.request.recv(4096)
    except KeyboardInterrupt:
       server.shutdown()

server = TCPServerV4((host, port), TCPHandler)
server.server_forever()
Run Code Online (Sandbox Code Playgroud)

我知道这段代码不起作用.我只想向您展示我想要完成的事情 - 当用户按下Ctrl-C时关闭服务器并在等待传入数据时退出应用程序.

python sockets socketserver

18
推荐指数
4
解决办法
3万
查看次数

SocketServer:摆脱'[Errno 98]已经在使用的地址'

我一直在查看文档SocketServer.我从文档中复制了TCP服务器代码,运行正常.但是,我注意到每当我在终端中按程序ctrl-c'ed,然后尝试再次运行它时,我会收到以下错误:

socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

我通过阅读本文本文来研究如何解决问题.我在代码中添加了以下行以尝试允许重用地址:

server.allow_reuse_address = True
Run Code Online (Sandbox Code Playgroud)

即使添加了上面的行,我仍然遇到同样的问题.我还添加了一个tryexcept我的server.serve_forever()函数,捕获KeyboardInterrupt异常并调用,server.shutdown()server.socket.close()希望释放该地址.

这是我的TCP服务器代码的完整范围(注意:我排除了MyTCPHandler类):

if __name__ == "__main__":
    HOST, PORT = '', 9999

    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.allow_reuse_address = True

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
        server.socket.close()
Run Code Online (Sandbox Code Playgroud)

我仍然在运行上面的代码时出错,必须等待一分钟,直到地址最终被释放.当我不断调试和更改代码时,这很令人沮丧. …

python socketserver python-2.7

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

PHP套接字 - 接受多个连接

我正在尝试创建一个简单的客户端/服务器应用程序,因此我正在尝试PHP中的套接字.

现在我在C#中有一个简单的客户端,它可以很好地连接到服务器,但我只能一次将一个客户端连接到这个服务器(我在网上找到了这个代码示例,并为了测试目的稍微调整了一下).

有趣的是,基于同样的例子,我发现了同样的问题:https://stackoverflow.com/questions/10318023/php-socket-connections-cant-handle-multiple-connection

我试图了解它的每个部分,我很接近看到它的工作原理,但由于某种原因,当我连接第二个客户端时,第一个客户端断开连接/崩溃.

任何人都可以给我一些疯狂的想法或指向我应该看的地方吗?

<?php
// Set time limit to indefinite execution
set_time_limit (0);
// Set the ip and port we will listen on
$address = '127.0.0.1';
$port = 9000;
$max_clients = 10;
// Array that will hold client information
$client = array();
// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock); …
Run Code Online (Sandbox Code Playgroud)

php sockets networking tcp socketserver

14
推荐指数
3
解决办法
3万
查看次数

Python - BaseHTTPServer.HTTPServer并发和线程

有没有办法使BaseHTTPServer.HTTPServer像SocketServer.ThreadingTCPServer一样多线程?

python multithreading basehttpserver httpserver socketserver

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

Python socket.send()只能发送一次,然后socket.error:[Errno 32]发生了断管

我是网络编程的新手,所以如果这是一个愚蠢的问题,请原谅我:)我使用Python2.7在Ubuntu 10.04.2上创建了1个客户端和1个SocketServer.ThreadingMixIn服务器,但似乎我只能调用sock .send()一次在客户端,然后我会得到一个:

Traceback (most recent call last):
  File "testClient1.py", line 33, in <module>
    sock.send('c1:{0}'.format(n))   
socket.error: [Errno 32] Broken pipe
Run Code Online (Sandbox Code Playgroud)

这是我写的代码:

testClient1.py:

#! /usr/bin/python2.7
# -*- coding: UTF-8 -*-
import sys,socket,time,threading
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    sock.connect(('localhost',20000))
except socket.error:
    print('connection error')
    sys.exit(0)
n=0
while n<=1000:
    sock.send('c1:{0}'.format(n))   
    result=sock.recv(1024)
    print(result)
    n+=1
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

testServer.py:

#! /usr/bin/python2.7
# -*- coding: UTF-8 -*-
import threading,SocketServer,time

class requestHandler(SocketServer.StreamRequestHandler):
    #currentUserLogin={} #{clientArr:accountName}
    def handle(self):
        requestForUpdate=self.rfile.read(4)
        print(requestForUpdate)
        self.wfile.write('server reply:{0}'.format(requestForUpdate))

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

if __name__ == '__main__':

    server=broadcastServer(('localhost',20000),requestHandler)
    t = threading.Thread(target=server.serve_forever)
    t.daemon=True …
Run Code Online (Sandbox Code Playgroud)

python broken-pipe socketserver

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

(是否)python socketserver优于常规套接字对象的性能优势?

感谢迄今为止的有趣回应.根据上述回复,我稍微改变了我的问题.

猜测我真正需要知道的是socketserver而不是设计用于处理延迟和压力时期的直接套接字库,即它是否有其他机制或功能可以证明其隐式广告状态为"服务器".或者它只是稍微容易使用?

每个人似乎都在推荐socketserver,但我仍然不完全清楚为什么,而不是套接字.

谢谢!!!

我已经在python中基于标准套接字库构建了一些服务器程序 http://docs.python.org/library/socket.html

我注意到他们似乎工作得很好,除了没有负载他们有一段时间后会睡觉的倾向.我想这可能不是在生产中的问题(毫无疑问,将会有大量的其他问题),但我想知道,如果我使用正确的代码工作在这里.

环顾四周,我看到python还提供了一个socketserver库 - http://docs.python.org/library/socketserver.html

插座库提供监听多个连接,通常高达5的能力.

根据socketserver页面,它的服务是同步的,即阻塞,但是可以通过线程支持异步行为.我确实注意到它有能力维护一个请求队列,默认值最多为5个请求......所以可能没有多大区别.

我还读过Twisted在引擎盖下运行socketserver.虽然我宁愿不进入像Twisted一样大小的野兽,除非它是值得的.

所以我的问题是,socketserver比socket更强大吗?如果是这样,为什么?

(你怎么知道?)

顺便说一句,socketserver是建立在python的套接字之上还是完全独立?

最后,作为奖励,如果有人知道什么可以做错,这样标准插座"睡着了",请随意加入.

哦,我在说python 2.x而不是3.x如果这有所作为.

谢谢大家!

JSH


好吧,我没有技术答案,但我已经按照人们的建议实施了SocketServer,它肯定更可靠.如果有人想出了低级别的解释,请告诉我...谢谢!

python sockets asynchronous synchronous socketserver

10
推荐指数
1
解决办法
2047
查看次数

Python SocketServer:发送到多个客户端?

好吧,我正在尝试用一个SocketServer构建一个小的python prgram,它应该将它收到的消息发送给所有连接的客户端.我卡住了,我不知道如何在服务器端存储客户端,我不知道如何发送给多个客户端.哦,我的程序每次超过1个客户端连接失败,每次客户端发送多个消息...

这是我的代码,直到现在:

        print str(self.client_address[0])+' connected.'
    def handle(self):
        new=1
        for client in clients:
            if client==self.request:
                new=0
        if new==1:
            clients.append(self.request)
        for client in clients:
            data=self.request.recv(1024)
            client.send(data)

class Host:
    def __init__(self):
        self.address = ('localhost', 0)
        self.server = SocketServer.TCPServer(self.address, EchoRequestHandler)
        ip, port = self.server.server_address
        self.t = threading.Thread(target=self.server.serve_forever)
        self.t.setDaemon(True)
        self.t.start()
        print ''
        print 'Hosted with IP: '+ip+' and port: '+str(port)+'. Clients can now connect.'
        print ''
    def close(self):
        self.server.socket.close()

class Client:
    name=''
    ip=''
    port=0
    def __init__(self,ip,port,name):
        self.name=name
        self.hostIp=ip
        self.hostPort=port
        self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.connect((self.hostIp, self.hostPort))
    def …
Run Code Online (Sandbox Code Playgroud)

python sockets networking socketserver python-2.7

9
推荐指数
2
解决办法
2万
查看次数

如何使用python SocketServer创建连接超时

美好的一天!我写的是简单的服务器:

class SingleTCPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        data = self.request.recv(1024) 
        self.request.close()

class SimpleServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):

    daemon_threads = True

    allow_reuse_address = True

    def __init__(self, server_address, RequestHandlerClass):
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)


def running():
    server = SimpleServer((settings.host, settings.port), SingleTCPHandler)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

如何设置连接超时.我想当客户端不向我发送数据并且在30秒内未激活时,服务器将关闭连接.

对不起我的英语.

UPDATE

#!/usr/bin/env python
# -*- coding: utf8 -*-

import sys
import time

import SocketServer
import datetime
import settings
import os
from signal import SIGTERM, SIGCHLD, signal, alarm
import socket
import subprocess
from threading import Thread
import MySQLdb
import re

class SingleTCPHandler(SocketServer.BaseRequestHandler): …
Run Code Online (Sandbox Code Playgroud)

python socketserver

8
推荐指数
2
解决办法
6940
查看次数