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

PHP服务端Socket连接Android客户端Socket时远程400错误排查

排查远程Socket连接出现400 Bad Request错误的解决方案

我来帮你分析下为啥本地Socket通信正常,但远程连接时出现400 Bad Request错误,以及怎么解决这个问题。

首先要明确:400 Bad Request是HTTP协议的错误码,这说明你的Android客户端发送的Socket连接请求,并没有被你部署在远程服务器上的PHP Socket服务接收,反而被服务器上的Apache Web服务接收到了——Apache把这个非HTTP的请求当成了无效的HTTP请求,所以返回了400错误。

一、核心原因排查

1. PHP Socket服务未在远程服务器正常启动

本地能正常运行的脚本,到了远程服务器可能因为各种原因启动失败:

  • 手动运行脚本检查报错:登录远程服务器,执行php your_socket_script.php(替换成你的脚本文件名),看终端是否输出socket created,有没有绑定端口失败的报错(比如端口被占用、权限不足)。
  • 检查端口占用情况:用命令查看15986端口是否被PHP进程占用:
    • Linux:netstat -tulpn | grep 15986
    • Windows:netstat -ano | findstr :15986
      如果输出的进程不是PHP(而是Apache/httpd或其他程序),说明端口被其他服务抢占了。

2. 远程服务器端口15986未对外开放

即使Socket服务正常启动,如果服务器的防火墙或云平台安全组没开放15986端口,客户端的连接请求可能被拦截,但这里返回400错误更可能是服务没启动,请求落到了Apache上。不过还是要确认:

  • 云服务器用户:去控制台的安全组规则里添加入站规则,允许TCP协议的15986端口访问。
  • Linux服务器:用iptables开放端口:
    iptables -A INPUT -p tcp --dport 15986 -j ACCEPT
    service iptables save  # 保存规则
    

3. 客户端连接配置错误

检查Android客户端的Constants.SOCKET_URL和Constants.SOCKET_PORT:

  • 确认SOCKET_URL是远程服务器的公网IP或正确域名,不是本地IP。
  • 确认SOCKET_PORT是15986,没有误写成80/443(这两个是Web服务端口,会被Apache接收)。

二、具体修复步骤

1. 让PHP Socket服务在远程服务器后台持续运行

直接运行PHP脚本时,关闭终端进程就会停止,需要用工具让它后台常驻:

nohup php your_socket_script.php &
  • nohup会让进程忽略挂起信号,&让进程在后台运行。
  • 检查进程是否存活:ps aux | grep your_socket_script.php

2. 更换被占用的端口(如果需要)

如果15986端口被其他服务占用,修改PHP脚本和Android客户端的端口号,比如换成15987,确保新端口未被占用且已对外开放。

3. 验证Socket连接是否正常

在远程服务器上用telnet测试端口是否能访问:

telnet 你的服务器公网IP 15986

如果能连接成功,说明服务正常;如果连接失败,回到前面的步骤排查。

三、额外注意事项

  • 确认远程服务器的PHP已启用socket扩展:执行php -m | grep socket,如果输出socket说明已启用。
  • 避免用域名测试,先直接用服务器公网IP连接,排除DNS解析问题。
  • 运行Socket服务的用户权限:1024以下的端口需要root权限,15986是大于1024的端口,普通用户即可运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:51:00