如何从Ubuntu生产服务器访问Windows主机的localhost/127.0.0.1?
如何从Ubuntu服务器访问Windows主机本地的Mantra MFS100生物识别服务?
需求与现状
- 需要从连接在客户Windows PC的Mantra MFS100生物识别设备获取数据,返回至Ubuntu生产服务器
- 根据Mantra文档,该生物识别服务运行在Windows本地
127.0.0.1,端口范围为11100-11120 - 在Windows本地(PyCharm IDE)中,以下代码可正常完成服务发现和数据捕获:
本地Windows环境可用代码
服务发现代码
import requests for port in xrange(11100, 11122, 1): response = requests.request('RDSERVICE', 'http://localhost:%s' % str(port), headers=headers, data=data) if response.status == "READY": device_port = port if port == 11121: print "Fingerprint device is not connected"
数据捕获代码
import requests response = requests.request('CAPTURE', 'http://localhost:%s/rd/capture' % device_port, headers=headers, data=data) print response.text
遇到的连接问题
从Ubuntu服务器访问时出现连接拒绝错误:
HTTPConnectionPool(host='127.0.1.1', port=11100): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f677d12cf10>: Failed to establish a new connection: [Errno 111] Connection refused',))
尝试使用socket.gethostbyname(socket.gethostname())获取IP作为端点也无效:
import requests import socket ip_address = socket.gethostbyname(socket.gethostname()) response = requests.request('CAPTURE', 'http://%s:%s/rd/capture' % (ip_address, device_port), headers=headers, data=data)
请求与响应格式
请求示例
RDSERVICE * HTTP/1.1 HOST: http://127.0.0.1:[port] EXT: APP_NAME
响应示例
HTTP/1.1 200 OK CACHE-CONTROL:no-cache LOCATION:http://127.0.0.1:<rd_service_port> Content-Length: length in bytes of the body Content-Type: text/xml Connection: Closed <RDService status="READY|USED|NOTREADY|..." info="provider info for display purposes"> <Interface id="CAPTURE" path="/rd/capture" /> <Interface id="DEVICEINFO" path="/rd/info" /> </RDService>
解决方案
1. 修改Mantra服务绑定IP
Mantra服务默认仅绑定127.0.0.1,只能本地访问。需修改服务配置(参考Mantra官方文档或服务设置界面),将其绑定到Windows主机的局域网公网IP(如192.168.x.x)或0.0.0.0(允许所有IP访问)。
2. 开放Windows防火墙端口
打开Windows Defender防火墙,创建入站规则:
- 允许TCP协议的11100-11120端口连接
- 规则应用范围选择对应网络环境(域/专用网络)
3. 使用Windows主机实际IP访问
修改Ubuntu端Python代码,将请求地址中的localhost替换为Windows主机的真实IP:
# 服务发现代码修改 windows_ip = "192.168.1.100" # 替换为Windows主机的实际局域网/公网IP for port in range(11100, 11122): response = requests.request('RDSERVICE', f'http://{windows_ip}:{port}', headers=headers, data=data) if response.status == "READY": device_port = port break else: print("Fingerprint device is not connected") # 数据捕获代码修改 response = requests.request('CAPTURE', f'http://{windows_ip}:{device_port}/rd/capture', headers=headers, data=data) print(response.text)
若Windows主机处于NAT网络(如家庭路由器后),需在路由器上设置端口转发,将11100-11120端口转发到Windows主机的局域网IP。
4. 可选:使用隧道工具(无公网IP场景)
如果无法直接暴露Windows主机端口,可使用隧道工具建立公网访问通道:
- 在Windows上运行
ngrok,映射本地端口:ngrok http 11100 -region ap(按需调整端口和区域) - Ubuntu服务器使用ngrok提供的公网地址发起请求
内容的提问来源于stack exchange,提问作者Rithik Sandron
相关产品推荐
相关产品推荐

