关于php socket问题

rgmlkthh 2009-07-15 09:28:57
大家好,请问在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";
?>
...全文
478 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cocoanet 2010-05-22
  • 打赏
  • 举报
回复
学习,mark。。
rgmlkthh 2009-07-17
  • 打赏
  • 举报
回复
对,问题就出在这里.不过我解决后你才来,分还是给最高吧.
也感谢另外两位热心的朋友哈!
[Quote=引用 19 楼 hotup 的回复:]
soket_read 要求无论是服务器还是客户端发过来的一句 要以 \r\n 结尾,,否则会认为服务器端发送未结束,因此进入死循环,

所以再每条soket_write 都要加上\r\n
[/Quote]
kiko89 2009-07-16
  • 打赏
  • 举报
回复
学习了
yctin 2009-07-15
  • 打赏
  • 举报
回复
<?php
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";
?>

试试你就知道什么事了
Gdj 2009-07-15
  • 打赏
  • 举报
回复
其中,你的socket_strerror用法错误。socket_strerror的参数是错误号,而不是socket。正确写法:
socket_strerror(socket_last_error());
rgmlkthh 2009-07-15
  • 打赏
  • 举报
回复
apache权限设成什么呢?我看了,都是
ServerAdmin admin@localhost呀.
很感谢你这样回复哈,最关键一条,麻烦你帮我copy以上代码在你机子上看能运行不?就最关键了哈.实在搞不清咋回事
查也查不到,都搞2天了.没想明白.
Gdj 2009-07-15
  • 打赏
  • 举报
回复
你这程序我测试过了。可以运行的,不会没显示。
客户端访问时,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.

也就是连上了服务端,然后连接被服务端中断了。
Gdj 2009-07-15
  • 打赏
  • 举报
回复
没用iis就检查apache的权限
rgmlkthh 2009-07-15
  • 打赏
  • 举报
回复
我用的是xampp运行php的,没有用IIS啊.还咋个检查呢?
Gdj 2009-07-15
  • 打赏
  • 举报
回复
你说的情况是socket函数被拥塞了。如果一点输出都没有,那很可能是在socket_create就拥塞了。你确定你iis的用户有权限创建socket吗?直接用cmd运行时,程序的权限是管理员。在网页时,权限用的是iis的运行用户。
检查一下权限吧。
rgmlkthh 2009-07-15
  • 打赏
  • 举报
回复
server.php我用的cmd运行的.再用cmd运行client.php是能收到welcome....这些服务器返回的信息的,
可是一把client.php换到浏览器运行,就不行了,浏览器下面运行不走,就是滚动条一点一点的,像打不开网页
似的.最后也出来不了.也没有提示信息. 大哥有没有php的环境,能否就上面的代码帮小弟测试一下,不胜感激.

因为最后的应用可能是C++做的服务器端,我这边用php去服务器端取数据.谢谢了.
Gdj 2009-07-15
  • 打赏
  • 举报
回复
怎么收不到信息。详细情况是什么样?服务端没变,只是客户端改为浏览器运行就出错?报错了还是怎么的?说详细点。
rgmlkthh 2009-07-15
  • 打赏
  • 举报
回复
楼上继续呀,帮我看看咋在浏览器上收不到信息呢,谢谢了.或者有没有能运行的例子啊.
Gdj 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 phpBoy005 的回复:]
PHP code
if (!$buf = trim($buf)) {
continue;
}

这个判断有点看不明白
[/Quote]

这个是去掉空格等东西,然后判断是否有值。
phpboy 2009-07-15
  • 打赏
  • 举报
回复

if (!$buf = trim($buf)) {
continue;
}



这个判断有点看不明白
rgmlkthh 2009-07-15
  • 打赏
  • 举报
回复
咋还是不行呢,在浏览器下运行程序,运行很慢,结果还出不来,收不到服务器返回的信息呢,麻烦楼上大哥,详细看下我的服务器和客户端代码,看在浏览器上运行成功不.十分感谢!
Gdj 2009-07-15
  • 打赏
  • 举报
回复
区别在于浏览器运行的话页面不能关掉,不然程序会中断。
解决办法:
在程序前加上ignore_user_abort(true);
确保你的程序里没有任何内容输出到页面。所有函数禁止报错。例如socket_strerror($ret);改为@socket_strerror($ret);
llj480028 2009-07-15
  • 打赏
  • 举报
回复
没接触过,但可以帮顶!
hotup 2009-07-15
  • 打赏
  • 举报
回复
soket_read 要求无论是服务器还是客户端发过来的一句 要以 \r\n 结尾,,否则会认为服务器端发送未结束,因此进入死循环,

所以再每条soket_write 都要加上\r\n
yctin 2009-07-15
  • 打赏
  • 举报
回复
无限循环不会返回:
while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
echo $out;
}
加载更多回复(2)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧