2013-08-25 56 views
1

慾望前等待客戶寫:我想連接到插座並有「運行」發送到客戶端的每一秒。套接字寫

當然這是一個測試。

Issue:輸出'running'僅在客戶端發送數據時發送。似乎循環暫停在客戶端等待回寫。

代碼:

$socket = @socket_create_listen("12345"); 

while (true) { 
    $client = socket_accept($socket); 
    $msg = "\nHello"."\r\n".chr(0); 
    $length = strlen($msg); 
    socket_write($client, $msg,$length); 
    usleep(5); 

    while (true) { 
     $msg = 'running'."\r\n".chr(0); 
     $length = strlen($msg); 
     socket_write($client, $msg, $length); 
     sleep(1); 
    } 
} 

實施例:上面的代碼是在我的服務器上的文件。如果我運行此文件,然後使用telnet連接到我的服務器的端口12345 telnet myip# 12345我期望看到每秒鐘在控制檯上打印「運行」。相反,「跑步」只寫一次。如果我在控制檯中輸入某些內容(即將數據寫入服務器),則會再次顯示running。因此,當我向服務器發送內容時,只運行發送到控制檯。

這是什麼原因造成的?

感謝 JT

+0

不可能說沒有看到同行代碼,但如果對方是送你的數據,併發送應該控制這些發送,你爲什麼不讀書呢? – EJP

+0

@EJP同行代碼?以上代碼位於服務器上的文件中。當我運行該文件時,我可以使用telnet從命令提示符進行連接... telnet myip#12345 ...在這裏,我想運行在每秒響應。我不知道爲什麼你聲稱這是不可能的? –

回答

2

服務器似乎很好。問題很可能與您的客戶。我調整了你的服務器,並寫了一個成功測試的客戶端。我的調整是檢查套接字關閉。否則,你會進入一個連續的循環。

這裏是socketserver.php

echo "Starting Server" . "\n\r"; 
$socket = @socket_create_listen("55000"); 
while (true) { 
    $client = socket_accept($socket); 
    $msg = "\nHello"."\r\n".chr(0); 
    $length = strlen($msg); 
    socket_write($client, $msg,$length); 
    usleep(5); 

    while (true) { 
     $msg = 'running'."\r\n".chr(0); 
     $length = strlen($msg); 
     $test = socket_write($client, $msg, $length); 
     sleep(1); 
     if ($test === false) { 
      echo "socket probably closed\n"; 
      exit; 
     } 

    } 
} 

這裏是socketclient.php

$address = '127.0.0.1'; 
$port = 55000; 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
    exit; 
} 

echo "\nStarting client"; 
echo "\nAttempting to connect to '$address' on port '$port'..."; 
$result = socket_connect($socket, $address, $port); 
echo "\n\nReading responses...\n\n"; 
while ($out = socket_read($socket, 2048)) { 
    echo $out; 
} 

echo "\nClosing socket..."; 
socket_close($socket); 

下面是結果的屏幕截圖。

PHP Client Server Example

我意識到,這是一個測試,但要注意定期狀態服務器更爲明智使用UDP設計。

+0

爲什麼要測試睡眠後套接字是否關閉? – xaxxon

+0

@丹Im希望只使用原始連接,因此沒有任何客戶端腳本,然後打開然後連接到服務器。 –

+0

@xaxxon我沒有關閉服務器。客戶做到了。支票會比發送更好。檢查需要到某個地方,否則邏輯會在客戶端斷開連接後進入無限的故障循環。 – Dan

1

您是否嘗試過使用任何其他客戶端? nc(netcat)非常適合測試。另外,將一些輸出放到服務器上,以便在發送數據時將其記錄(屏幕或文件)。

我猜你的服務器工作正常,但您的客戶端以某種方式搞砸了。只需輸入nc <my_ip> 12345,看看你得到了什麼。

記住,遠程登錄是一個實際的協議(http://tools.ietf.org/html/rfc854),而NC只是直的TCP。

此外,NUL終止字符串可能會導致奇怪的問題。丟失chr(0)位,看看它是否變得更好。

+0

立即嘗試!非常感謝 –

+0

@tman剛剛更新了chr(0)的內容。試試看。 – xaxxon

+0

我添加了那一點,當它不工作,但我會嘗試一些事情,併發回!感謝您的幫助 –