python 之socket

背景:

有个这样的需求,pc端调用移动端app执行某项任务,那么如何知道app已执行完毕?我们可以通过:

方式1:adb logcat 抓取app日志结束关键字

方式2:通过socket, pc端起一个socket 服务,app执行完毕后作为客户端和服务端通信告诉已经执行完毕

socket 原理

socket (套接字)是网络通信的基本操作单元,是不同主机进程相互通信的api, 通过ip和端口号可以具体知道是哪个进程。它工作在我们的协议栈之上,socket是对 TCP/IP 或者UDP/IP协议的封装。

sockert包含进行网络通信必须的五种信息:

连接使用的协议,

本地主机的IP地址,

本地进程的协议端口,

远地主机的IP地址,

远地进程的协议端口

实现

1、手机和pc建立通信

Android手机通过USB连接电脑后,在终端直接执行adb reverse tcp:8081 tcp:8081,然后在手机中访问127.0.0.1:8081,就可以访问到电脑上启动的服务了。

#手机与PC端建立重定向,使其进行通信,重定向成功 connect_code = True
def islink():
    SERVER_CLEAN = f"adb reverse --remove-all"
    SERVER_PORT = f"adb reverse tcp:12121 tcp:12121"
    SERVER_CHECK = f"adb reverse --list"
    os.system(SERVER_CLEAN)
    os.system(SERVER_PORT)
    sub = subprocess.Popen(SERVER_CHECK, shell=True, stdout=subprocess.PIPE)
    content = str(sub.communicate()[0], encoding="utf8").strip()
    connect_code = "tcp:12121 tcp:12121" in content
    return connect_code

命令解释
adb reverse --remove-all: remove all reverse socket connections from device

adb reverse --list: list all reverse socket connections from device

pc端服务:

def server_socket():
    link_state = islink()
    if (link_state is True):
        # 默认参数AF_INET就是IP地址族
        # 参数SOCK_STREAM就是TCP、参数SOCK_DGRAM就是UDP、参数SOCK_RAW是原始套接字
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            #为这个socket绑定IP和端口
            s.bind(('127.0.0.1', 12121))
            # 使socket处于监听状态,等待客户端的请求,只有服务端能使用监听
            # 参数5表示,最多接收5个等待连接的客户端
            s.listen(5)
            print("Waiting : connect......")
            # 监听socket的accept方法,用来接收客户端的连接,如果没有客户端连接,就一直处于监听状态(阻塞状态)直到有客户端连接,
            # 一旦客户段发起连接(TCP三次握手)accept方法就会返回一个元组,一个conn来传输数据,一个address包含IP和PORT
            conn, address = s.accept()
            while True:
                data = conn.recv(1024)
                print("server_received:", repr(data))
                conn.sendall(data)
                    

client

def client_socket():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(('127.0.0.1', 12121))
        while True:
            toSend = input('client>>> ')
            if toSend == 'exit':
                break
            s.sendall(toSend.encode('utf-8'))
            #接受服务端消息
            received = s.recv(1024)
            print(received.decode('utf-8'))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值