创建socket客户端连接,收不到服务端消息,请老大指点。。。

dreamboycx

在虚拟机192.168.1.199中使用gatewayworker时创建TCP服务,如下图:

图片

我在本地写的client.php写一个socket来连接虚拟机上的gatewayworker:

    error_reporting(E_ALL);
    set_time_limit(0);

    $port = 80;
    $ip = "192.168.1.199";

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 if ($socket < 0) {
     echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
 }

 $result = socket_connect($socket, $ip, $port);
 if ($result < 0) {
     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
 }

 $in = "Tiger";
 $out = '';

 if(!socket_write($socket, $in, strlen($in))) {
     echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
 }else {
     echo "发送到服务器信息成功!\n";
 }

while($out = socket_read($socket, 1024,PHP_NORMAL_READ)) {
     echo "接收服务器回传信息成功!\n";
     echo "接受的内容为:",$out;
 }
 echo "关闭SOCKET...\n";
 socket_close($socket);

在虚拟机上的gatewayworker只写了简单的回复信息:

 public static function onMessage($client_id, $message)
   {
        if($message=='T'){
            Gateway::sendToClient($client_id,"TTTTTTTTTTTTTTT");
        }else{
            Gateway::sendToClient($client_id,"$client_id said $message");
        }

   }

可是本地执行client.php时,没有反应,甚至是浏览器卡死,在命令行的cmd下也不行,问题好像出在while循环上,while换成if就能成功,不知道while循环好像变成了死循环,socket_read已经写了只读1024个字节啊,读完了不是应该跳出循环吗?请老大指点。。。

12538 6 0
6个回答

walkor

你的客户端socket是阻塞的,socket_read会一直阻塞等待数据,直到超时返回空,在超时之前所会一直卡死。

  • 暂无评论
dreamboycx

是的,阻塞了,但是服务端返回数据了啊,为什么还一直是等待数据直到超时呢?
另外,我在生产服务器开启了以下服务,socket能连接,但无认怎样也无法接收和发送数据,服务端连触发都不触发,服务如下图

[attach]308[/attach]

我就是想简单实现客户端的socket服务连接workerman服务器,实现socket通讯。。。。

  • 暂无评论
walkor

因为你代码while循环一直读数据,客户端读到数据后还要再读,这时服务端已经没有数据可读了,就一直卡着了。

另外你的workerman版本太老了,建议用新的版本。

  • 暂无评论
dreamboycx

哦,那个明白了,呆会我加上\r\n试试,应该就能中断了,另外老版本还能运行,所以也没有再换新版本,老版本应该也能socket数据写入和接收吧?为什么我能够连接上,但却无法发送和接收数据呢?

  • 暂无评论
walkor

应该是你客户端写的有问题,可以抓包看下是否有收到数据接收数据,抓包方法看workerman手册吧。
另外服务端是否收到数据可以调试打印看下,如何调试打印也看看workerman手册。

  • dreamboycx 2016-05-25

    我打印了,生产环境服务端没有接收到数据,所以客户端也没有收到返回的数据,一直循环,服务端没有收到数据的原因想不通,以上代码client.php就是客户端的代码,我已经写了socket_write,收不到数据不会老的workerman有什么bug不让接收吧?

  • walkor 2016-05-25

    看下防火墙吧

  • dreamboycx 2016-05-25

    @1:防火墙没有运行,很奇怪,我用各种TCP软件连接,都可以正常连接,但就是发送不了数据。。。。

  • walkor 2016-05-25

    请抓包

  • dreamboycx 2016-05-26

    @1:抓包结果如下:192.168.1.187是本机客户端,192.168.1.199是虚拟机gatewayworker服务端,抓包时,服务端调试没有反应。
    看不太懂,请老大明示。。。。

    10:51:43.091911 IP 192.168.1.187.65524 > 192.168.1.199.http: Flags [S], seq 3821433153, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
    E..4LF@.@.i............P..qA...... .t...............
    10:51:43.091933 IP 192.168.1.199.http > 192.168.1.187.65524: Flags [S.], seq 2117329769, ack 3821433154, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
    E..4..@.@............P..~3.i..qB..9..;..............
    10:51:43.092455 IP 192.168.1.187.65524 > 192.168.1.199.http: Flags [.], ack 1, win 16425, length 0
    E..(LG@.@.i............P..qB~3.jP.@)3.........
    10:51:43.092473 IP 192.168.1.187.65524 > 192.168.1.199.http: Flags [P.], seq 1:6, ack 1, win 16425, length 5
    E..-LH@.@.i............P..qB~3.jP.@)....Tiger.
    10:51:43.092478 IP 192.168.1.199.http > 192.168.1.187.65524: Flags [.], ack 6, win 229, length 0
    E..(`.@.@.U..........P..~3.j..qGP...s+..
    10:51:49.432155 IP 192.168.1.187.65528 > 192.168.1.199.http: Flags [S], seq 3728501284, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
    E..4LM@.@.i............P.<j$...... .................
    10:51:49.432307 IP 192.168.1.199.http > 192.168.1.187.65528: Flags [S.], seq 1221440554, ack 3728501285, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
    E..4..@.@............P..H...<j%..9.k...............
    10:51:49.433823 IP 192.168.1.187.65528 > 192.168.1.199.http: Flags [.], ack 1, win 16425, length 0
    E..(LN@.@.i............P.<j%H..+P.@).4........
    10:51:49.433855 IP 192.168.1.187.65528 > 192.168.1.199.http: Flags [P.], seq 1:6, ack 1, win 16425, length 5
    E..-LO@.@.i............P.<j%H..+P.@)wX..Tiger.
    10:51:49.433866 IP 192.168.1.199.http > 192.168.1.187.65528: Flags [.], ack 6, win 229, length 0
    E..((f@.@............P..H..+.<j
    P....s..

liulaoliu

你好我也遇到了同样的问题,请问是如何解决的,万分感谢!

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