2013-04-30 185 views
4

我是套接字连接的新手, 我想向套接字服务器发送一些命令,但是我只能发送第一条消息而不是其他消息。套接字客户端发送消息

客户:

$fp = stream_socket_client("tcp://127.0.0.1:1000", $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $cmd_1 = "hello"; 
    fwrite($fp, $cmd_1); 
    while (!feof($fp)) { 
     print_r(fgets($fp, 1024)); 
    } 
    $cmd_2 = "second message"; 
    fwrite($fp, $cmd_2); 
    while (!feof($fp)) { 
     print_r(fgets($fp, 1024)); 
    } 
    fclose($fp); 
} 

我怎么能发送类似第一$cmd_1多条消息,并且依赖于结果,我要送$cmd_2

服务器

error_reporting(E_ALL); 

/* Allow the script to hang around waiting for connections. */ 
set_time_limit(0); 

/* Turn on implicit output flushing so we see what we're getting 
* as it comes in. */ 
ob_implicit_flush(); 

$address = '127.0.0.1'; 
$port = 1000; 

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
} 

if (socket_bind($sock, $address, $port) === false) { 
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

if (socket_listen($sock, 5) === false) { 
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

do { 
    if (($msgsock = socket_accept($sock)) === false) { 
     echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
     break; 
    } 
    /* Send instructions. */ 
    $msg = "\nWelcome to the PHP Test Server. \n" . 
     "To quit, type 'quit'. To shut down the server type 'shutdown'.\n"; 
    socket_write($msgsock, $msg, strlen($msg)); 

    do { 
     if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
      echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
      break 2; 
     } 
     if (!$buf = trim($buf)) { 
      continue; 
     } 
     if ($buf == 'quit') { 
      break; 
     } 
     if ($buf == 'shutdown') { 
      socket_close($msgsock); 
      break 2; 
     } 
     $talkback = "PHP: You said '$buf'.\n"; 
     socket_write($msgsock, $talkback, strlen($talkback)); 
     echo "$buf\n"; 
    } while (true); 
    socket_close($msgsock); 
} while (true); 

socket_close($sock); 
+0

你是什么错误?事实上你的问题是什么? – leftclickben 2013-04-30 08:26:26

+0

我可以发送第一条消息,我只收到第一条消息的回复,而不是第二条消息。 – user2136174 2013-04-30 08:27:32

+0

你确定你的服务器的行为?是否对从客户端获得的每个输入做出响应?你应该检查fgets和fwrite函数的返回值。 – Marcassin 2013-04-30 09:00:49

回答

0

的问题是在下面的一行:

while (!feof($fp)) { 

什么,做的是:它等待插槽上的EOF(套接字关闭通常情况下)。它会得到你第一个响应,并等待进一步的响应而不发送任何进一步的请求(while循环)。你想读取你发送的每个请求消息的响应消息,对吧?

修改代码,像这样的(未经测试,但应工作):

$cmd_1 = "hello"; 
fwrite($fp, $cmd_1); 
print_r(fgets($fp, 1024)); 

$cmd_2 = "second message"; 
fwrite($fp, $cmd_2); 
print_r(fgets($fp, 1024)); 

fclose($fp); 

fgets(..)将返回从插座一旦行被读取。你实际上不需要一个while循环。


此外,它是一个很好的一点,开始定义您的通信结构/协议。在客户端,您正在逐行阅读,但不是服务器。插座(在服务器上)读取可以返回部分消息。如果您决定使用通信结构,则可以将读取设计为不返回,直到读取整个结构为止。

+0

谢谢你的回复,但仍然得到相同的结果。 – user2136174 2013-04-30 09:49:26

0

问题是与

if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
    break 2; 
} 

而是比较假的做=== ''

if ('' === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
    echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
    break 2; 
} 

否则连接被提前关闭 - 在这里看到的 - http://www.php.net/manual/en/function.socket-read.php#89133

相关问题