准备研究这个课题的时候一头雾水,对socket以及php实现socket一无所知。于是检索了一下相关文章。大部分的文章要么说的云山雾绕,满篇都是理论,要么直接贴代码,一点说明都没有。还好在万千博文中看到某位大大的精彩讲解,受益良多~ 现在先把这位大大的博文连接贴出来,以供过路游客共同瞻仰: 深入浅出讲解:php的socket通信
说实话,基础不好,大学读的也不是计算机软件专业,前面的一通理论还是没太看懂。大概的意思可能是说socket就是实现双端通信的一种tcp/ip封装?不管理论,直接调试代码!
运行中。。。
运行成功!
大大的代码出奇的好用!没改什么配置就运行成功了~
然后再自己慢慢消化理解代码中的精髓。(其实大大的代码里还是有很多问题,尤其是错误处理部分略粗糙,通讯失败可能就会变得一团糟。下面贴出来的是我进行了一些调整后的代码)
模拟服务端:
<?php
header("Content-type:text/html;charset=utf-8");
//确保在连接客户端时不会超时
set_time_limit(0);
$ip = '127.0.0.1';
$port = 1935;
/*
+-------------------------------
* @socket通信整个过程
+-------------------------------
* @socket_create
* @socket_bind
* @socket_listen
* @socket_accept
* @socket_read
* @socket_write
* @socket_close
+--------------------------------
*/
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if(!$sock) {
die("socket_create() 失败的原因是:".iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error()))."<br>");
}
$ret = socket_bind($sock,$ip,$port);
if(!$ret) {
die("socket_bind() 失败的原因是:".iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error()))."<br>");
}
$ret = socket_listen($sock,4);
if(!$ret) {
die("socket_listen() 失败的原因是:".iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error()))."<br>");
}
//最大通讯次数
$count = 0;
do {
$msgsock = socket_accept($sock);
if (!$msgsock) {
echo "socket_accept() failed: reason: " . iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error())) . "<br>";
break;
} else {
//发到客户端
$msg ="测试成功!<br>";
socket_write($msgsock, $msg, strlen($msg));
echo "测试成功了啊<br>";
$buf = socket_read($msgsock,8192);
$talkback = "收到的信息:$buf<br>";
echo $talkback;
if(++$count >= 5){
break;
};
}
//echo $buf;
socket_close($msgsock);
} while (true);
socket_close($sock);
模拟客户端:
<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(E_STRICT);
set_time_limit(0);
echo "<h2>TCP/IP Connection</h2>";
$port = 1935;
$ip = "127.0.0.1";
/*
+-------------------------------
* @socket连接整个过程
+-------------------------------
* @socket_create
* @socket_connect
* @socket_write
* @socket_read
* @socket_close
+--------------------------------
*/
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create() failed: reason: " . iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error())) . "<br>");
}else {
echo "OK.<br>";
}
echo "试图连接 '$ip' 端口 '$port'...<br>";
$result = socket_connect($socket, $ip, $port);
if (!$result) {
die("socket_connect() failed.<br>Reason: " . iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error())) . "<br>");
}else {
echo "连接OK<br>";
}
$in = "hello world<br>";
$out = '';
if(!socket_write($socket, $in, strlen($in))) {
echo "socket_write() failed: reason: " . iconv('EUC-CN', 'UTF-8',socket_strerror(socket_last_error())) . "<br>";
}else {
echo "发送到服务器信息成功!<br>";
echo "发送的内容为:<font color='red'>$in</font> <br>";
}
while(socket_read($socket, 8192)) {
echo "接收服务器回传信息成功!<br>";
echo "接受的内容为:",$out;
}
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
客户端每次通讯成功显示:
达到最大通讯次数后服务端显示:
达到最大通讯次数后,客户端显示:
至此,算是简单的了解了一下socket和php实现socket了。但是据说php的socket服务性能并不优秀,所以实际应用中可能还是要用其他语言实现。。。