You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket Server与Android客户端无法建立连接求助

排查Android客户端无法连接Python Socket服务器的问题

核心问题排查与修复

1. Python服务端语法错误(直接导致连接后无响应)

你的Python代码采用Python 2写法,若运行环境为Python 3,print作为函数必须加括号,否则客户端连接时会触发语法错误,服务端直接崩溃,因此你看不到任何连接日志。

原错误代码片段:

print
'Connect with ' + addr[0] + ':' + str(addr[1])
buf = conn.recv(64)
print
buf

修正为Python 3兼容写法:

print('Connect with ' + addr[0] + ':' + str(addr[1]))
buf = conn.recv(64)
print(buf.decode('utf-8'))  # 解码字节为字符串,避免输出b'xxx'格式

同时,绑定地址建议改为0.0.0.0,监听所有可用网络接口,避免因指定固定IP导致的网卡绑定错误:

HOST = "0.0.0.0"

另外,原异常处理的字符串拼接存在语法错误,修正为:

print(f"Bind Failed, Error Code: {err[0]}, Message: {err[1]}")

2. Android客户端必备权限缺失

必须在AndroidManifest.xml中添加网络权限,否则应用无法发起网络请求:

<uses-permission android:name="android.permission.INTERNET"/>

3. 客户端异常日志无法查看

原代码中e.printStackTrace()在Android后台线程无法输出到Logcat,改用Log类打印错误,方便排查连接失败原因:

import android.util.Log;

// 在catch块中替换为
Log.e("SocketError", "连接或发送失败", e);

4. 客户端未正确关闭Socket资源

发送完消息后需关闭输出流和Socket,确保连接正常终止:

outToServer.flush();
outToServer.close();
socket.close();

修正后的完整代码

Python服务端

import socket
import sys

HOST = "0.0.0.0"  # 监听所有网络接口
PORT = 1234

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')

try:
    s.bind((HOST, PORT))
except socket.error as err:
    print(f"Bind Failed, Error Code: {err[0]}, Message: {err[1]}")
    sys.exit()

print("Socket Bind Success!")
s.listen(10)
print("Socket is now listening")

while True:
    conn, addr = s.accept()
    print(f'Connect with {addr[0]}:{str(addr[1])}')
    buf = conn.recv(64)
    if buf:
        print(f"Received: {buf.decode('utf-8')}")
        # 可选:回复客户端确认消息已收到
        conn.sendall(b"Message received")
    conn.close()  # 处理完请求后关闭连接

s.close()

Android SendMessage类(修正后)

package com.example.client;

import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class SendMessage extends AsyncTask<String, Void, Void> {
    @Override
    protected Void doInBackground(String... params) {
        Socket socket = null;
        PrintWriter outToServer = null;
        try {
            socket = new Socket("192.168.x.x", 1234);  // 替换为服务器实际局域网IP
            outToServer = new PrintWriter(
                    new OutputStreamWriter(
                            socket.getOutputStream(), "UTF-8"));
            outToServer.print(params[0]);
            outToServer.flush();
            Log.d("SocketSuccess", "消息发送成功");
        } catch (IOException e) {
            Log.e("SocketError", "连接或发送失败", e);
        } finally {
            // 确保资源被关闭
            if (outToServer != null) {
                outToServer.close();
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    Log.e("SocketError", "关闭Socket失败", e);
                }
            }
        }
        return null;
    }
}

额外排查步骤

  • 确认服务器与Android设备处于同一局域网,用ping命令测试互通性
  • 检查服务器防火墙是否开放了1234端口
  • 代码中的服务器IP需替换为实际局域网IP,不要用公网IP测试局域网连接

内容的提问来源于stack exchange,提问作者Melanie Heim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:10:50