服务端代码server.php
<?php //创建socket套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); /** * 第一个参数说明: * AF_UNIX(本机通信) * AF_INET(TCP/IP – IPv4) * AF_INET6(TCP/IP – IPv6) * 第二个参数说明: * SOCK_STREAM(TCP流) * SOCK_DGRAM(UDP数据报) * SOCK_RAW(原始套接字) * 第三个参数说明: * 如果第二个参数选择的是TCP,则传递SOL_TCP否则就SOL_UDP */ if (!$socket) { echo 'create socket error' . PHP_EOL; } else { echo 'create socket success' . PHP_EOL; } /** * 因为一台主机可能存在多个 ip 地址,所以你需要指定你的 socket 监听的是哪一个, * 常用的值为 127.0.0.1,或者是监听所有地址 0.0.0.0, * 那么这里可能有人不明白了,127.0.0.1 和 0.0.0.0 有啥区别呢? * 127.0.0.1 只是一个回环地址,只能用于本机访问,说白了就是自己玩自己的,因为这个 ip 不对外部开放,所以别人也就无法访问这个地址, * 所以如果你的服务器地址设置为 127.0.0.1,别人想要访问,只能去屎吧。 * 0.0.0.0 严格来说不算是一个 ip 地址,它的意思是本机的所有 IP 地址,都是我的,哈哈。 */ //绑定ip和端口 $addr = '127.0.0.1'; $port = 8080; if (socket_bind($socket, $addr, $port)) { echo 'bind addr success' . PHP_EOL; } else { echo 'bind addr error' . PHP_EOL; } //监听套接字 if (!socket_listen($socket)) { echo 'listen socket error' . PHP_EOL; } else { echo 'listen socket success' . PHP_EOL; } //接受客户端连接 $client = socket_accept($socket); if (!$client) { echo 'socket_accept error' . PHP_EOL; } else { echo 'socket_accept success' . PHP_EOL; //接受客户端返回内容 while (true) { //第一个参数是客户端套接字 第二个参数从socket中获取的数据 第三个参数是设置长度最多为 len 字节的数据将被接收。 $bytesNum = socket_recv($client, $buffer, 100, 0); if (!$bytesNum) { echo "socket_recv failed" . PHP_EOL; exit(1); } else { echo "content from client:" . $buffer . PHP_EOL; } } }
客户端代码client.php
<?php //创建socket套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //连接套接字 if (!socket_connect($socket, '127.0.0.1', 8080)) { echo 'socket connect error' . PHP_EOL; exit(1); } else { while (true) { //阻塞进程获取输入内容 $data = fgets(STDIN); //如果用户输入quit,那么退出程序 if (strcmp($data, "quit") == 0) { break; } //发送数据给服务端 socket_write($socket, $data); } }
这里先运行php server.php,然后运行php client.php,然后输入内容,服务端就能接受到了。
注:服务端代码接受信息用socket_recv的是socket_accept返回的客户端套接字而不是服务端套接字,刚开始运行总是报错,记录下