用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结束,以后或许会用到。