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
相关产品推荐
相关产品推荐

