通过通过 adb 转发的端口连接套接字应用程序时出现问题

Issue when connecting a socket application over a port forwarded over adb

我正在开发一个应用程序,它在 PC 和客户端上有一个服务器作为通过 adb (USB) 连接的 android 设备。 我通过以下方式设置了端口转发:adb forward tcp:5100 tcp:5100

每当我尝试 运行 我的 python 服务器时,它会说:

server.bind(("127.0.0.1", 5100))
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

这是我的服务器代码:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
        #server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
        server.bind(("127.0.0.1", 5100))
        server.listen()
        
        print("Waitng for client Sockets " + socket.gethostname())
        conn, address = server.accept()
        with conn:
            print("Connected to framework", address)
            while True:
                recvdStr = conn.recv(1024)
                if not recvdStr:
                    break
                print("Received: " + recvdStr.decode())

客户代码:

#include <jni.h>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testframeworktest_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";

    int client = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(5100);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(client, (sockaddr*)&serverAddr, sizeof(sockaddr));
    send(client, "sending test string", strlen("sending test string"), 0);
    send(client, "", strlen(""), 0);
    return env->NewStringUTF(hello.c_str());
}

启用端口转发后,netstat -an 显示我的端口是这个状态:

 TCP    127.0.0.1:5100         0.0.0.0:0              LISTENING
  1. 使用 USB 数据线将 phone 连接到 PC。
  2. 发出命令:adb usb
  3. 发出命令:adb tcpip 5100
  4. 发出命令:adb connect xxx.xxx.xxx.xxx

要让 python 服务器代码和 android 客户端相互交谈,您应该使用 adb 反向而不是正向。 这是您应该使用的 adb 命令

adb reverse tcp:5100 tcp:5100