下面是我目前使用的代码:
#! /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,'地址已在使用中')
答案 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。