Python

Python socket借助ngrok建立外网TCP连接

2018-09-21  本文已影响0人  GameDesign2018

#python #内网穿透 #端口映射 #port forwarding #socket #nat #TCP/IP #网络编程

目的是利用python3的socket库,建立以下两个终端之间的连接并传输简单的binary数据:

〇、设备简介

服务器:

设备:Windows 10 PC
终端:cmd
网络:公网动态IP(由无线路由器接入)

客户端:

设备:Android Phone
终端QPython3 - 终端
网络:移动4G

一、ngrok的配置:

二、执行服务器的代码:

import socket
import threading
import time
# 源代码来自廖雪峰的python3教程
# https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000#0

# 以下是每次TCP连接将要执行的线程
def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Greating from Windows 10 PC server!')
    while True:
        data = sock.recv(1024)      # For this session, pause here, once client socket send message proceed following:
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)

if __name__ == '__main__':
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 监听Localhost端口
    s.bind(('127.0.0.1', 9999))
    s.listen(5)
    print('Waiting for connection...')
    while True:
        sock, addr = s.accept()     # Paused here, once received connection proceed the following:
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()
三、使用ngrok开启服务器的TCP端口转发
四、执行客户端的代码

在安卓 QPython3* 中打开终端,并执行以下代码
ipport变量修改成第三步中ngrok提示的地址与端口
* QPython3 下载地址

import socket
import androidhelper

droid = androidhelper.Android()  # 处理弹出提示

ip = "0.tcp.ngrok.io"
port = 19240

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))

datarecv = s.recv(1024).decode('utf-8')
droid.makeToast(datarecv) # 手机端将弹出 

# 发送数据
s.send(b'Steve')
# 接收数据
datarecv = s.recv(1024).decode('utf-8')
# 展示数据
droid.makeToast(datarecv)
上一篇下一篇

猜你喜欢

热点阅读