工作不正常
问题描述:
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连接,出现一个白页,如果我输入任何值或敲击任何键,连接将会丢失。
任何想法为什么会发生这种情况?
亲切的问候
答
这个问题可能是你的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脚本,因为没有写入任何内容)。
你期望发生什么?另外,请使用[Streams](http://www.php.net/manual/en/book.stream.php)扩展名 - 它更易于使用且更易于使用。 – DaveRandom 2011-12-23 13:49:39
我期望首先看到任何说我连接的东西,当我输入一个字符串时,它会反转它并将其返回。 – Momo 2011-12-23 14:06:29
可能想查看node.js以创建套接字服务器守护程序。将获得更好的性能。 – dqhendricks 2011-12-23 18:35:59