2011-12-23 111 views
0

PHP插座我已經建立了一個服務器通過端口1122上我127.0.0.1 這裏聽傳入的請求是我的代碼:工作不正常

<?php 

// set some variables 
$host = "127.0.0.1"; 
$port = 1122; 


// don't timeout! 
//Since this is a server, it's also a good idea to use the set_time_limit() 
//function to ensure that PHP doesn't time out and die() while waiting for 
//incoming client connections. 

set_time_limit(0); 


// create socket 
// The AF_INET parameter specifies the domain, while the SOCK_STREAM 
// parameter tells the function what type of socket 
// to create (in this case, TCP). 
//If you wanted to create a UDP socket, you could use the 
//following line of code instead:socket_create(AF_INET, SOCK_DGRAM, 0) 

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


// bind socket to port 
//Once a socket handle has been created, the next step is to attach, 
//or "bind", it to the specified address and port. 
//This is accomplished via the socket_bind() function. 

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


// start listening for connections 
//With the socket created and bound to a port, it's time to start listening 
//for incoming connections. PHP allows you to set the socket up as a listener 
//via its socket_listen() function, which also allows you to specify the number 
//of queued connections to allow as a second parameter (here 3) 

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


// accept incoming connections 
// spawn another socket to handle communication 
//Once a client connection is received, the socket_accept() function springs 
//into action, accepting the connection request and spawning another 
//child socket to handle messaging between the client and the server. 
//This child socket will now be used for all subsequent communication 
//between the client and server. 

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

// read client input 
//With a connection established, the server now waits for the client 
//to send it some input - this input is read via the socket_read() function, 
//and assigned to the PHP variable $input. 
//The second parameter to socket_read() specifies the number of bytes of input to read - 
//you can use this to limit the size of the data stream read from the client. 
//Note that the socket_read() function continues to read data from the client 
//until it encounters a carriage return (\n), a tab (\t) or a \0 character. 
//This character as treated as the end-of-input character, and triggers 
//the next line of the PHP script. 

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

// clean up input string 
//The server now must now process the data sent by the client - in this example, 
//this processing merely involves reversing the input string 
//and sending it back to the client. 
//This is accomplished via the socket_write() function, which makes it possible 
//to send a data stream back to the client via the communication socket. 
//The socket_write() function needs three parameters: a reference to the socket, 
//the string to be written to it, and the number of bytes to be written. 

$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 
//Once the output has been sent back to the client, both generated sockets 
//are terminated via the socket_close() function. 

socket_close($spawn); 
socket_close($socket); 
?> 

這會聽取客戶端,並返回一個值逆轉的inout。

該代碼不會給出任何錯誤。實際上,當我到localhost/socket.php它將繼續加載。

現在我用terraterm打開一個telnet連接,出現一個白頁,如果我輸入任何值或敲擊任何鍵,連接將會丟失。

任何想法爲什麼會發生這種情況?

親切的問候

+0

你期望發生什麼?另外,請使用[Streams](http://www.php.net/manual/en/book.stream.php)擴展名 - 它更易於使用且更易於使用。 – DaveRandom 2011-12-23 13:49:39

+0

我期望首先看到任何說我連接的東西,當我輸入一個字符串時,它會反轉它並將其返回。 – Momo 2011-12-23 14:06:29

+1

可能想查看node.js以創建套接字服務器守護程序。將獲得更好的性能。 – dqhendricks 2011-12-23 18:35:59

回答

1

這個問題可能是你的TERA長期使用「字符模式」,這意味着輸入的每一個字符直接發送到服務器。

這會導致socket_read立即返回,只讀一個字符。

調用socket_read時,您可以設置PHP_NORMAL_READ

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

如果沒有這個標誌,直到\n寫入socket_read讀。

否則它的行爲正常。該腳本不會將任何輸出寫入瀏覽器,因此瀏覽器只是等待,直到設置了一些超時(Webserver可能會終止PHP腳本,因爲沒有寫入任何內容)。