建议:在了解socket之前首先要去了解下TCP/IP协议,此外在我也是最近接触,谷歌百度搜索一大堆,在这里特别强调的是技术相关的还是谷歌搜索比较好,比较真实也很全面,包括国外的一些解决方案都有,谷歌在国内是链接不上的,如果有兴趣了解可以私聊我
在了解socket之前先看下PHP手册,PHP手册也有这方面的解释,当然在了解至于我突然想到了curl ,就搜了很多对比但是少只又少,总之socket是更接近底层,curl也是socket的扩展,有人也说过CURL有的功能socket都具备,甚至功能还会很多,如果你技术够牛逼强大,也可以利用socket封装成一个类似curl的工具,当然还有swoole后期准备介绍,或者你自认为厉害的工具,当然是用PHP的话curl是很简单的,如果后期有兴趣不妨多了解下,相对来说socket也很简单,只是数据解析方面对我来说有些不是很顺利,如果是涉及到二进制流的数据可能要PHP自行的解析,现在给大家粘贴代码供参考(本人也是在网上搜的案例,最后自己调试了下)
要测试socket必须要有客户端 和 服务端 ,我这边准备了两台机器,一个是我的主机另外一个是我用VMware在主机创建的一个虚拟机
环境系统:window7(两台机器都为win7系统)
服务端代码
<?php
//确保在连接客户端时不会超时
set_time_limit(0);
//第1步:设置变量,如“主机”和“端口”
$host = "0.0.0.0";
$port = 5577;
echo "Hello this is server ..."."\n>";
//第2步:创建socket
$socket = socket_create(AF_INET, SOCK_STREAM,SOL_TCP ) or die("Could not create socket\n");
//第3步:绑定socket到端口和主机
//创建的socket资源绑定到IP地址和端口号。
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
//第4步:启动socket监听
//在绑定到IP和端口后,服务端开始等待客户端的连接。在没有连接之前它就一直等下去。
$result = socket_listen($socket,3) or die("Could not set up socket listener\n");
/*第5步:接受连接
这个函数会接受所建的socket传入的连接请求。在接受来自客户端socket的连接后,该函数返回另一个socket资源,
实际上就是负责与相应的客户端socket通信。这里的“$spawn”就是负责与客户端socket通信的socket资源。*/
/*$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
//第6步:从客户端socket读取消息(READ 包含多种方法位于第二个参数返回字节长度)
$input = socket_read($spawn, 8192) or die("Could not read input\n");
$input = trim($input);
echo "Client Message : ".$input;
//反转消息发送消息至客户端
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");*/
// 持续等等客户端请求最后做出响应
$count=0;
do {
if (($msgsock = socket_accept($socket)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
} else {
$input1 = socket_read($msgsock, 8192) or die("Could not read input\n");
$input = strrev($input1). "\n";
//发到客户端
$msg ="第[".$count."]次响应...";
socket_write($msgsock, $msg.$input, strlen($msg.$input));
echo $input1."\n";
}
$count++;
//echo $buf;
socket_close($msgsock);
} while (true);
//关闭sockets
//socket_close($spawn);
socket_close($socket);
?>
客户端代码
<?php
// socket server host and prot
echo "Hello This is client"."<br>";
$host = "192.168.87.56";
$port = 5577;
$message = "Hello Server Server! By James connection";
echo "Message To server:".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM,SOL_TCP) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
$result = socket_read ($socket, 8192) or die("Could not read server response\n");
echo "Reply From Server :".$result;
// close socket
socket_close($socket);
?>
所遇到的问题:因为防火墙而通信失败,在防火墙的高级设置里面增加了入站规则与出站规则每个规则里添加特定的端口号,防止防火墙屏蔽导致通信失败,
我在主机与虚拟机都加了,还有一点就是你的入站与出站规则的协议要和你代码的一致,我代码上是tcp协议(socket服务器代码在第二步的时定义的
$socket = socket_create(AF_INET, SOCK_STREAM,SOL_TCP ) or die("Could not create socket\n");
函数的详情要参考PHP手册或者自己去搜索多看看,此外在防火墙的问题和协议都弄完之后,如果PHP版本较低也会导致通信失败,建议用最高版本。