用php好几年了,工作中一直没用到socket这块,今天心血来潮,顺着手册及网上资料试了试。
socket是在服务器端和客户端之间通讯的,因此这里就准备这两端。
服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
代码如下
<?php
// 服务端
set_time_limit(0);
$ip = '127.0.0.1';
$port = 3290;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed,reason:" . socket_strerror($sock) . PHP_EOL;
}
if (($ret = socket_bind($sock, $ip, $port)) < 0) {
echo "socket_bind() failed,reason:" . socket_strerror($ret) . PHP_EOL;
}
if (($ret = socket_listen($sock, 4)) < 0) {
echo "socket_listen() failed,reason:" . socket_strerror($ret) . PHP_EOL;
}
$count = 0;
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed,reason:" . socket_strerror($msgsock) . PHP_EOL;
break;
}
$msg = 'test sucess' . PHP_EOL;
socket_write($msgsock, $msg , strlen($msg));
echo 'test sucess';
$buf = socket_read($msgsock, 1024);
echo 'receive message' . $buf . PHP_EOL;
if (++$count >=5) {
break;
}
socket_close($msgsock);
} while(true);
socket_close($sock);
<?php
// 客户端
error_reporting(E_ALL);
set_time_limit(0);
echo 'TCP/IP Connection' . PHP_EOL;
$ip = '127.0.0.1';
$port = 3290;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo 'socket_create() failed,reason ' . socket_strerror($sock) . PHP_EOL;
} else {
echo 'OK' . PHP_EOL;
}
echo 'Try to connect ' . $ip . ' port ' . $port . '...' . PHP_EOL;
if (($result = socket_connect($sock, $ip, $port)) < 0) {
echo 'socket_connect() failed,reason ' . socket_strerror($result) . PHP_EOL;
} else {
echo 'Connect suessful';
}
$in = "Hi\r\nThis is a test new\r\n";
if (socket_write($sock, $in, strlen($in))) {
echo 'Send success' . PHP_EOL;
echo "Send message is \r\n" . $in . PHP_EOL;
} else {
echo 'socket_write() failed,reason ' . socket_strerror($result) . PHP_EOL;
}
while ($out = socket_read($sock, 1024)) {
echo 'Receive server message success' . PHP_EOL;
echo 'Message is :' . $out . PHP_EOL;
}
echo 'Close SOCKET ...' .PHP_EOL;
socket_close($sock);
echo 'Close OK' . PHP_EOL;
在服务器上,先跑服务端代码
再跑客户端代码。
至此,初试socket结束,以后或许会用到。