我创建了一个RESTful服务器,当我使用本地IP地址时,我可以成功发出请求并获得响应。我希望它能在外部暴露在互联网上。我设置了一个端口转发规则,但我似乎无法让事情发生。从我正在阅读"连接被拒绝" (7)表示无论是防火墙还是ISP问题,都会阻止它。关于该怎么做的任何想法?
这是我的curl命令,适用于我的本地IP:
Pako-2:Pokebot pako$ curl -X GET http://192.168.1.8:30000/api/v1/getrecord/test
{"data": [{"id": 1, "title": "learn python"}, {"id": 2, "title": "get paid"}]}
这是我在尝试使用What's my ip
给我的外部IP地址时看到的内容Pako-2:Pokebot pako$ curl -X GET http://MyIpHere:30000/api/v1/getrecord/test
curl: (7) Failed to connect to myIPAddress port 30000: Connection refused
以下是我的路由器/调制解调器高级设置选项。我试过调整我的防火墙设置,但没有运气。我尝试过仅使用NAT,并且还检查了所有端口的低安全级别。
-----------------编辑-----------------
这是我的服务器的一些python代码:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import threading
import argparse
import re
import cgi
import json
TODOS = [
{'id': 1, 'title': 'learn python'},
{'id': 2, 'title': 'get paid'},
]
class LocalData(object):
records = {}
class HTTPRequestHandler(BaseHTTPRequestHandler):
print "HTTPRequestHandler BaseHTTPRequestHandler = ", BaseHTTPRequestHandler
def do_POST(self):
print "do_POST"
if None != re.search('/api/v1/addrecord/*', self.path):
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'application/json':
length = int(self.headers.getheader('content-length'))
data = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
recordID = self.path.split('/')[-1]
LocalData.records[recordID] = data
print "record %s is added successfully" % recordID
else:
data = {}
self.send_response(200)
self.end_headers()
else:
self.send_response(403)
self.send_header('Content-Type', 'application/json')
self.end_headers()
return
def do_GET(self):
print "do_GET"
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps({'data': TODOS}))
return
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
allow_reuse_address = True
def shutdown(self):
self.socket.close()
HTTPServer.shutdown(self)
class SimpleHttpServer():
def __init__(self, ip, port):
self.server = ThreadedHTTPServer((ip, port), HTTPRequestHandler)
def start(self):
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
def waitForThread(self):
self.server_thread.join()
def addRecord(self, recordID, jsonEncodedRecord):
LocalData.records[recordID] = jsonEncodedRecord
def stop(self):
self.server.shutdown()
self.waitForThread()
if __name__ == '__main__':
server = SimpleHttpServer("0.0.0.0", 30000)
print 'HTTP Server Running...........'
server.start()
server.waitForThread()
-------------------编辑2 --------------------
答案 0 :(得分:2)
我觉得很奇怪你会在本地网络中拒绝连接,因为路由器应该能够检测到外部IP是对自身的引用。
这种能力可能取决于路由器,但那是我在网络方面的经验。
话虽这么说,如果您想在播放端口转发规则后测试外部防火墙,那么您需要一台不在本地网络上的设备。
如果您无法使用其他类似智能手机的设备,那么您可以尝试使用CanYouSeeMe来测试端口是否正在打开。
您可能还想为服务器设置DHCP预留。换句话说,设置静态IP地址。