大家好,请问在php下如何实现socket通信呢.
我现在写了一个服务器端和客户端代码,就是如果客户端连接上了,服务器端则返回一条信息.
这个代码,我在cmd模式下用php.exe client.php去运行可以收到信息,但为啥用浏览器运行client.php
就不行了呢,这两种模式下面运行php程序有啥区别吗?我就想实现能通用浏览器得到服务器返回的消息
哈,谢谢了,代码如下.顶者有重分.<?php
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 = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
} while (true) {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\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)); while (true) {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror($ret) . "\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";
}
socket_close($msgsock);
}
socket_close($sock);
?> client.php<?php
error_reporting(E_ALL);//echo "<h2>TCP/IP Connection</h2>\n";/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}$result = socket_connect($socket, "127.0.0.1", 10000);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
echo $out;
}
echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>
我现在写了一个服务器端和客户端代码,就是如果客户端连接上了,服务器端则返回一条信息.
这个代码,我在cmd模式下用php.exe client.php去运行可以收到信息,但为啥用浏览器运行client.php
就不行了呢,这两种模式下面运行php程序有啥区别吗?我就想实现能通用浏览器得到服务器返回的消息
哈,谢谢了,代码如下.顶者有重分.<?php
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 = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
} while (true) {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\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)); while (true) {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror($ret) . "\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";
}
socket_close($msgsock);
}
socket_close($sock);
?> client.php<?php
error_reporting(E_ALL);//echo "<h2>TCP/IP Connection</h2>\n";/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}$result = socket_connect($socket, "127.0.0.1", 10000);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
echo $out;
}
echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>
解决办法:
在程序前加上ignore_user_abort(true);
确保你的程序里没有任何内容输出到页面。所有函数禁止报错。例如socket_strerror($ret);改为@socket_strerror($ret);
if (!$buf = trim($buf)) {
continue;
}这个判断有点看不明白
可是一把client.php换到浏览器运行,就不行了,浏览器下面运行不走,就是滚动条一点一点的,像打不开网页
似的.最后也出来不了.也没有提示信息. 大哥有没有php的环境,能否就上面的代码帮小弟测试一下,不胜感激.因为最后的应用可能是C++做的服务器端,我这边用php去服务器端取数据.谢谢了.
检查一下权限吧。
客户端访问时,server 37行报错,然后中断了。
客户端显示的结果:
OK. OK.
Warning: socket_read() [function.socket-read]: unable to read from socket [0]: 操作成功完成。 in D:\newmod\test\t2.php on line 21
Closing socket...OK.也就是连上了服务端,然后连接被服务端中断了。
ServerAdmin admin@localhost呀.
很感谢你这样回复哈,最关键一条,麻烦你帮我copy以上代码在你机子上看能运行不?就最关键了哈.实在搞不清咋回事
查也查不到,都搞2天了.没想明白.
socket_strerror(socket_last_error());
error_reporting(E_ALL);ob_start();
//echo "<h2>TCP/IP Connection</h2>\n";
echo "<pre>";
/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}
ob_flush();
flush();$result = socket_connect($socket, "127.0.0.1", 10000);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}
ob_flush();
flush();while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
echo $out;
ob_flush();
flush();
}
echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>试试你就知道什么事了
可是为啥请求本机的就得不到回复呢.楼上大哥,代码你测试了的嘛?麻烦大家了.解决问题了分再加100哈.
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";把服务端最前面的\n去掉即可。$msg = "Welcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
echo $out;
}