如今咱们把第一个例子停止完美。你需求监听一个指定的socket而且处置用户的毗连。
<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Accept any incoming connections to the server
$connection = socket_accept($socket);
if($connection)
{
socket_write($connection, "You have connected to the socket...\n\r");
}
?>
你应当利用你的号令提醒符来运转这个例子。来由是由于这里将发生一个办事器,而不是一个Web页面。假如你测验考试利用Web阅读器来运转这个剧本,那末很有能够它会超越30秒的限时。你可使用上面的代码来设置一个无穷的运转工夫,然而仍是建议利用号令提醒符来运转。
set_time_limit(0);
在你的号令提醒符中对这个剧本停止复杂测试:
Php.exe example01_server.php
假如你没有在体系的情况变量中设置php注释器的途径,那末你将需求给php.exe指定具体的途径。当你运转这个办事器真个时分,你可以经由过程近程上岸(telnet)的体例毗连到端口1337来测试这个办事器。以下图:
下面的办事器端有三个成绩:1. 它不克不及承受多个毗连。2. 它只完成独一的一个号令。3. 你不克不及经由过程Web阅读器毗连这个办事器。
这个第一个成绩对照轻易处理,你可使用一个使用法式去每次都毗连到办事器。然而前面的成绩是你需求利用一个Web页面去毗连这个办事器,这个对照坚苦。你可让你的办事器承受毗连,然后些数据到客户端(假如它必定要写的话),封闭毗连而且守候下一个毗连。
在上一个代码的基本上再改善,发生上面的代码来做你的新办事器端:
<?php
// Set up our socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true)
{
// Accept any connections coming in on this socket
$connection = socket_accept($socket);
printf("Socket connected\r\n");
// Check to see if there is anything in the buffer
if($buffer != "")
{
printf("Something is in the buffer...sending data...\r\n");
socket_write($connection, $buffer . "\r\n");
printf("Wrote to socket\r\n");
}
else
{
printf("No Data in the buffer\r\n");
}
// Get the input
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))
{
$buffer = $data;
socket_write($connection, "Information Received\r\n");
printf("Buffer: " . $buffer . "\r\n");
}
socket_close($connection);
printf("Closed the socket\r\n\r\n");
}
?>
这个办事器端要做甚么呢?它初始化一个socket而且翻开一个缓存收发数据。它守候毗连,一旦发生一个毗连,它将打印“Socket connected”在办事器真个屏幕上。这个办事器反省缓冲区,假如缓冲区里无数据,它将把数据发送到毗连过去的盘算机。然后它发送这个数据的承受信息,一旦它承受了信息,就把信息保留到数据里,而且让毗连的盘算机晓得这些信息,最初封闭毗连。当毗连封闭后,办事器又入手下手处置下一次毗连。(翻译的烂,附上原文)
This is what the server does. It initializes the socket and the buffer that you use to receive
and send data. Then it waits for a connection. Once a connection is created it prints
“Socket connected” to the screen the server is running on. The server then checks to see if
there is anything in the buffer; if there is, it sends the data to the connected computer.
After it sends the data it waits to receive information. Once it receives information it stores
it in the data, lets the connected computer know that it has received the information, and
then closes the connection. After the connection is closed, the server starts the whole
process again.
◆ 发生一个客户端
处置第二个成绩是很轻易的。你需求发生一个php页毗连一个socket,发送一些数据进它的缓存并处置它。然后你又个处置后的数据在还顿,你可以发送你的数据到办事器。在别的一台客户端毗连,它将处置那些数据。
To solve the second problem is very easy. You need to create a PHP page that connects to
a socket, receive any data that is in the buffer, and process it. After you have processed the
data in the buffer you can send your data to the server. When another client connects, it
will process the data you sent and the client will send more data back to the server.
上面的例子示范了利用socket:
<?php
// Create the socket and connect
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket,’localhost’, 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
if($buffer == “NO DATA”)
{
echo(“<p>NO DATA</p>”);
break;
}
else
{
// Do something with the data in the buffer
echo(“<p>Buffer Data: “ . $buffer . “</p>”);
}
}
echo(“<p>Writing to Socket</p>”);
// Write some test data to our socket
if(!socket_write($socket, “SOME DATA\r\n”))
{
echo(“<p>Write failed</p>”);
}
// Read any response from the socket
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
echo(“<p>Data sent was: SOME DATA<br> Response was:” . $buffer . “</p>”);
}
echo(“<p>Done Reading from Socket</p>”);
?>
这个例子的代码演示了客户端毗连到办事器。客户端读取数据。假如这是第一工夫抵达这个轮回的初次毗连,这个办事器将发送“NO DATA”前往给客户端。假如情形产生了,这个客户端在毗连之上。客户端发送它的数据到办事器,数据发送给办事器,客户端守候呼应。一旦承受到呼应,那末它将把呼应写到屏幕上。