Python SocketServer适用于localhost,但不适用于服务器

时间:2012-07-02 16:48:51

标签: python sockets

下面是我目前使用的代码:

#! /usr/bin/python
print 'Content-type: application'
print '\n\n'

import SocketServer
import cgitb
cgitb.enable()

class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())
        self.request.sendall('Data Received')

if __name__ == "__main__":
    HOST, PORT = "localhost", 9989

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

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

代码在localhost上按预期工作,但在公共服务器上没有响应。

此外,执行代码两次会导致以下错误消息:

  

错误:(98,'地址已在使用中')

4 个答案:

答案 0 :(得分:5)

我认为问题在于你绑定到"localhost",即在loopback接口上。尝试将"localhost"替换为要绑定的公共IP地址。如果您不确定那是什么,请在命令行键入ifconfig;选择不在指定供私人使用的任何一个IP块中的地址(即,不以10.或192.168等开头)。

我不确定它是否适用于TCPServer,但通常需要绑定到特定接口的软件会接受所有接口的"0.0.0.0",或者接受相同效果的空字符串。

答案 1 :(得分:4)

  

错误:(98,'地址已在使用中')

你需要这个:

socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  

但在公共服务器上没有响应。

通常在共享托管的情况下,您无法通过创建套接字来完成。在任何情况下,您都可以尝试以下方法,看看它是否有帮助:

HOST, PORT = "", 9989 # or (public_IP,9989)

答案 2 :(得分:0)

您必须"localhost"函数使用gethostbyname()

server = SocketServer.TCPServer((socket.gethostbyname(HOST), PORT), MyTCPHandler)

但您必须记住,某些计算机无法理解"localhost",您必须使用本地主机IP地址127.0.0.1

答案 3 :(得分:-1)

由于您有静态端口地址(9989),因此无法运行两次。只能有一个绑定到端口的侦听器。可以有多个到端口的传入连接,但只有一个侦听器。

此外,您是否检查了防火墙设置。无论您的python服务器在哪里运行,防火墙都必须授予端口9989接受传入连接的权限。此外,如果您的服务器位于集线器后面,则必须告知集线器哪个主机将处理端口9989。