4

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

#! /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()

该代码在本地主机上按预期工作,但在公共服务器上无响应。

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

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

4

4 回答 4

5

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

我不确定它是否会专门与 TCPServer 一起使用,但通常需要您绑定到特定接口的软件将接受"0.0.0.0"所有接口,或者空字符串以达到相同的效果。

于 2012-07-02T16:59:54.020 回答
5

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

你需要这个:

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

但在公共服务器上无响应。

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

HOST, PORT = "", 9989 # or (public_IP,9989)
于 2012-07-02T16:56:22.990 回答
0

您必须"localhost"gethostbyname()功能使用:

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

但是您必须记住,有些机器不理解"localhost",您必须使用本地主机 IP 地址127.0.0.1

于 2014-12-12T05:53:22.007 回答
-1

您不能运行它两次,因为您有一个静态端口地址 (9989)。只能有一个监听器绑定到一个端口。该端口可以有多个传入连接,但只有一个侦听器。

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

于 2012-07-02T16:57:20.523 回答