在虚拟机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个字节啊,读完了不是应该跳出循环吗?请老大指点。。。
你的客户端socket是阻塞的,socket_read会一直阻塞等待数据,直到超时返回空,在超时之前所会一直卡死。
是的,阻塞了,但是服务端返回数据了啊,为什么还一直是等待数据直到超时呢?
另外,我在生产服务器开启了以下服务,socket能连接,但无认怎样也无法接收和发送数据,服务端连触发都不触发,服务如下图
[attach]308[/attach]
我就是想简单实现客户端的socket服务连接workerman服务器,实现socket通讯。。。。
因为你代码while循环一直读数据,客户端读到数据后还要再读,这时服务端已经没有数据可读了,就一直卡着了。
另外你的workerman版本太老了,建议用新的版本。
哦,那个明白了,呆会我加上\r\n试试,应该就能中断了,另外老版本还能运行,所以也没有再换新版本,老版本应该也能socket数据写入和接收吧?为什么我能够连接上,但却无法发送和接收数据呢?
应该是你客户端写的有问题,可以抓包看下是否有收到数据接收数据,抓包方法看workerman手册吧。
另外服务端是否收到数据可以调试打印看下,如何调试打印也看看workerman手册。
我打印了,生产环境服务端没有接收到数据,所以客户端也没有收到返回的数据,一直循环,服务端没有收到数据的原因想不通,以上代码client.php就是客户端的代码,我已经写了socket_write,收不到数据不会老的workerman有什么bug不让接收吧?
看下防火墙吧
@1:防火墙没有运行,很奇怪,我用各种TCP软件连接,都可以正常连接,但就是发送不了数据。。。。
请抓包
@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..+.<jP....s..
你好我也遇到了同样的问题,请问是如何解决的,万分感谢!