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

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

0524.jpg


我在本地写的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[0]=='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个字节啊,读完了不是应该跳出循环吗?请老大指点。。。



已邀请:

walkor

赞同来自: jangson

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

walkor

赞同来自:

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

dreamboycx

赞同来自:

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

0525.jpg


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

walkor

赞同来自:

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

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

dreamboycx

赞同来自:

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

要回复问题请先登录注册