0
這是我的PHP客戶端代碼的服務器:腓socket_close()掛起我的客戶,直到disconect我
<?php
$service_port = 5310;
$address = gethostbyname('192.168.40.100');
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />";
else
{
$result = socket_connect($socket, $address, $service_port);
if ($result === false)
echo "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "<br />";
else
{
$in = "Envio esto: HOLA";
$out = 'RESPONSE: ';
echo "ANTES: " . date("H:i:s") . "<br />"; // #1
socket_write($socket, $in, strlen($in));
echo "DESPUÉS: " . date("H:i:s") . "<br />"; // #2 Same time as #1
// Leer/imprimir respuesta
while ($out = socket_read($socket, 2048))
echo "RESPONSE: " . date("H:i:s") . " " . $out; // #3 Same time as #2
}
}
// Cerramos socket
socket_close($socket);
echo "BANANA: " . date("H:i:s") . "<br />"; // Always run when I got disconected from server
?>
我沒有訪問server code
,但我讀了一點點,它在VB.net
writen它使用了像Client.socket.send()
這樣的東西,我得到了迴應,並且當服務器拋棄了我時,我發現這些回顯打印得很好,如果不是這樣,我的php將被掛起。
編輯 我爲了告訴請,disconect我的服務器添加另一個socket_write()
,但第二個不被髮送到服務器。
<?php
$service_port = 5310;
$address = gethostbyname('192.168.40.100');
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />";
else
{
$result = socket_connect($socket, $address, $service_port);
if ($result === false)
echo "socket_connect() falló.\nRazón: (" . $result . ") " . socket_strerror(socket_last_error($socket)) . "<br />";
else
{
$in = "Envio esto: HOLA";
$out = '';
$response = "RESPONSE: ";
echo "PRIMERA;";
socket_write($socket, $in, strlen($in));
while ($out = socket_read($socket, 2048))
$response .= $out;
echo $response . ";SEGUNDA;";
$in = "close";
$out = '';
$response = "";
socket_write($socket, $in, strlen($in));
while ($out = socket_read($socket, 2048))
$response .= $out;
echo $response . " " . date("H:i:s");
}
}
socket_close($socket);
?>
嗨,謝謝你的回答,但我需要從服務器接收響應,所以我認爲我必須使用阻塞模式。我會更新我的代碼。 – rokimoki
然後,一種解決方案是設置非阻塞,然後循環讀取調用,所以如果您從未從服務器收到任何數據,請再次嘗試讀取。 (然後設置一個自定義超時,或另一個檢查是否應該停止嘗試閱讀)。 – crowebird
這是一個很好的解決方案,購買爲什麼它是我的PHP在沒有'nonblock'的情況下掛出''socket_close()'? – rokimoki