php socket編程 讀完成後寫堵塞

來源:互聯網
上載者:User
php socket編程 讀完成後寫阻塞
server端代碼 如下:

set_time_limit(0);

$host = "127.0.0.1";
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not createsocket\n"); // 建立一個Socket

$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n"); //綁定Socket到連接埠

$result = socket_listen($socket) or die("Could not set up socket listener\n"); // 開始監聽串連

$spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); // 處理通訊

//若換成迴圈接收資料,用戶端將一直處理等待接收狀態
$input = socket_read($spawn, 1024) or die("Could not read data\n");
/*
while (( $data = socket_read($spawn, 1024)) != false)
$input .= $data;
*/

echo 'input:', strlen($input), "\n";

$output = date("Y-m-d H:i:s"). "\n"; //處理用戶端輸入並返回結果

echo "output:", $output, "\n";

//資料傳送 向用戶端寫入返回結果
socket_write($spawn, $output, strlen($output)) or die("Could not write output\n");

// 關閉sockets
socket_close($spawn);
socket_close($socket);


client端, 代碼如下:


set_time_limit(0);

$host = "127.0.0.1";
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not createsocket\n"); // 建立一個Socket

$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n"); // 串連

socket_write($socket, "time") or die("Write failed\n"); // 資料傳送 向伺服器發送訊息

echo 'wait for data';

while (($buffer = socket_read($socket, 1024))!=false) {
echo("Data sent was: time\nResponse was:" . $buffer . "\n");
}

socket_close($socket);

如果將server端對client read操作換成迴圈內部讀取,則client會一直處於 wait data狀態。
有辦法讓server端迴圈讀的情況下,讀完後給client寫資料嗎



socket tcp php server

分享到:


------解決方案--------------------
你這個迴圈沒有錯,但是一次資料發送完成就關閉socket串連了,沒有迴圈的必要吧。
------解決方案--------------------
while (true) {
$msg = socket_accept ($socket); // 接受一個SOCKET
if (!$msg) {
echo "socket_accept() failed:".socket_strerror ($msg)."\n";
break;
}
while (true) {
$command = strtoupper (trim (socket_read ($msg, 1024))); //等待用戶端資料
if (!$command) break;
//相關處理,比如直接回顯
socket_write ($msg, $command, strlen ($command));
}
socket_close ($msg);
if ($command == "QUIT") //如果收到的是通訊結束
break;
}
socket_close ($socket); // 關閉SOCKET

------解決方案--------------------
引用:
Quote: 引用:


set_time_limit(0);

$host = "127.0.0.1";
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not createsocket\n"); // 建立一個Socket

$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n"); //綁定Socket到連接埠

$result = socket_listen($socket) or die("Could not set up socket listener\n"); // 開始監聽串連

$spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); // 處理通訊

//若換成迴圈接收資料,用戶端將一直處理等待接收狀態
$input = socket_read($spawn, 1024) or die("Could not read data\n");
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.