在虛擬機192.168.1.199中使用gatewayworker時創(chuàng)建TCP服務(wù),如下圖:
我在本地寫的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 "發(fā)送到服務(wù)器信息成功!\n";
}
while($out = socket_read($socket, 1024,PHP_NORMAL_READ)) {
echo "接收服務(wù)器回傳信息成功!\n";
echo "接受的內(nèi)容為:",$out;
}
echo "關(guān)閉SOCKET...\n";
socket_close($socket);
在虛擬機上的gatewayworker只寫了簡單的回復(fù)信息:
public static function onMessage($client_id, $message)
{
if($message=='T'){
Gateway::sendToClient($client_id,"TTTTTTTTTTTTTTT");
}else{
Gateway::sendToClient($client_id,"$client_id said $message");
}
}
可是本地執(zhí)行client.php時,沒有反應(yīng),甚至是瀏覽器卡死,在命令行的cmd下也不行,問題好像出在while循環(huán)上,while換成if就能成功,不知道while循環(huán)好像變成了死循環(huán),socket_read已經(jīng)寫了只讀1024個字節(jié)啊,讀完了不是應(yīng)該跳出循環(huán)嗎?請老大指點。。。
是的,阻塞了,但是服務(wù)端返回數(shù)據(jù)了啊,為什么還一直是等待數(shù)據(jù)直到超時呢?
另外,我在生產(chǎn)服務(wù)器開啟了以下服務(wù),socket能連接,但無認(rèn)怎樣也無法接收和發(fā)送數(shù)據(jù),服務(wù)端連觸發(fā)都不觸發(fā),服務(wù)如下圖
[attach]308[/attach]
我就是想簡單實現(xiàn)客戶端的socket服務(wù)連接workerman服務(wù)器,實現(xiàn)socket通訊。。。。
哦,那個明白了,呆會我加上\r\n試試,應(yīng)該就能中斷了,另外老版本還能運行,所以也沒有再換新版本,老版本應(yīng)該也能socket數(shù)據(jù)寫入和接收吧?為什么我能夠連接上,但卻無法發(fā)送和接收數(shù)據(jù)呢?
應(yīng)該是你客戶端寫的有問題,可以抓包看下是否有收到數(shù)據(jù)接收數(shù)據(jù),抓包方法看workerman手冊吧。
另外服務(wù)端是否收到數(shù)據(jù)可以調(diào)試打印看下,如何調(diào)試打印也看看workerman手冊。
我打印了,生產(chǎn)環(huán)境服務(wù)端沒有接收到數(shù)據(jù),所以客戶端也沒有收到返回的數(shù)據(jù),一直循環(huán),服務(wù)端沒有收到數(shù)據(jù)的原因想不通,以上代碼client.php就是客戶端的代碼,我已經(jīng)寫了socket_write,收不到數(shù)據(jù)不會老的workerman有什么bug不讓接收吧?
@1:抓包結(jié)果如下:192.168.1.187是本機客戶端,192.168.1.199是虛擬機gatewayworker服務(wù)端,抓包時,服務(wù)端調(diào)試沒有反應(yīng)。
看不太懂,請老大明示。。。。
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..