3

所以我有这个服务器代码,它适用于我的客户端。但它从客户端获取一条消息并反向发送一条消息。这是代码:SERVER.php

<?php 

    $host = "127.0.0.1"; 
    $port = 1234; 

    // don't timeout! 
    set_time_limit(0); 

    // create socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 

    // bind socket to port 
    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 

    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 

    // close sockets 
    socket_close($spawn); 
    socket_close($socket); 

?>

如何编辑此代码以便它可以连续运行?客户端当然不必熬夜,它只会打开一个新的套接字,发送一条消息,从服务器取回并关闭套接字。下次我想发消息时,我会再次执行上一步。

现在,如果我发送一条消息并从服务器获得响应,它们都会关闭套接字。请帮我修改服务器端,使其不会关闭套接字并等待新连接。

我尝试添加一个while循环,但是一旦客户端关闭,服务器就会再次关闭,说它无法再从客户端读取。

谢谢

4

4 回答 4

6

我想到了。你们中的大多数人都接近解决它,就像我使用 while() 循环一样。但是你不能只是把你的代码放在 while 中并期望它能够工作。正确的做法如下:

<?php 
$host = "127.0.0.1"; 
$port = 1234; 

// don't timeout! 
set_time_limit(0); 

// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 

// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
    while(true) {
    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 
    }
// close sockets 
socket_close($spawn); 
socket_close($socket); 

?>

如果您尝试将 while 放在任何其他位置,则会引入错误。 谢谢大家的帮助 :D

于 2013-03-07T21:35:32.037 回答
0

接受后你需要分叉 - 见这里http://php.net/manual/en/function.pcntl-fork.php

接受需要在一个循环中。接受分叉后,处理该客户端的进程。

IE

while (TRUE)
{
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    $pid = pcntl_fork();
    if ($pid == -1) {
         die('could not fork');
    } else if ($pid) {
         // we are the parent
         socket_close($spawn);
    } else {
         // we are the child
         // Use $spawn for communication as you see fit
         // exit();
    }    
}

您将需要使用信号处理程序来整理僵尸进程。

于 2013-03-06T22:26:56.223 回答
-1

“蛮横”的方式是将您的代码插入无限循环中。

While(1){
     .
     .
 }

否则,在收到您的消息后,您可以递归调用您的脚本。

于 2013-03-06T22:20:58.337 回答
-1
  while( TRUE ) {

      // your code


  }
于 2013-03-06T22:41:39.387 回答