使用tp6手册workerman代码,客户端和服务器连接一次后断开,closed by foreign host

左补阙

用tp6+worker,tcp连接,要保持长连接。用的是tp6开发手册workerman一节的代码。
<?php
namespace app\http;

use think\worker\Server;

class Worker extends Server
{
protected $socket = 'http://0.0.0.0:2346'; (此处我已经改成tcp协议tcp://0.0.0.0:2345)

public function onMessage($connection,$data)
{
    $connection->send(json_encode($data));
}

}

客户端用xshell,
期待结果的是telnet连接后,服务器和客户端保持一段时间的长连接。
实际结果是:telnet连接,只互相传递一次消息,接到服务器消息返回后,就断了,closed by foreign host。

期待长连接,我看workman的视频教程,也是简单的代码,没加onclose是不会断开的。初接触workman,不知问题在哪。请指教,谢谢。

3803 4 0
4个回答

xiuwang

你开的是http协议的端口,然后用telnet访问,发送的数据不符合http协议格式,估计算是非法数据格式,所以连接断开了。

protected $socket = 'http://0.0.0.0:2346';

改成

protected $socket = 'tcp://0.0.0.0:2346';

试下。
也就是用tcp协议

  • 左补阙 2021-06-22

    不好意思,刚才是我疏忽,没有说到这个。我发帖前已经像你说的,改成tcp协议的了。我的目的也是使用tcp协议的。就是这个连接会断。数据能正常的在服务器和客户端传递的。

xiuwang

debug方式运行看下是不是有报错。
如果不行就直接用workerman试下,排除tp问题。

2548a

两边的代码都完整贴出来,代码正常不会这样的,这种99%还是你代码问题,还有,有可能是因为你哪边报错重启导致断开了

左补阙

问题终于搞定。操作步骤如下:
1.直接搭建一个纯workman项目,运行,没问题;
2.搭建一个新的tp+worker项目,运行,出现问题,还是closed by foreign host;
这时开始怀疑是php版本和tp的兼容问题,因为我linux默认用的是php8.0。用小皮面板+tp项目,如果选择php8版本也是运行不起来的。
3.把我linux的默认php版本8.0卸载,装回7.4.
4 重启,终于运行成功。

具体原因不清楚,也没改什么代码。确实是搞定了。谢谢协助的大佬,xiuwang,2548a。

  • 暂无评论
年代过于久远,无法发表回答
🔝