版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
UnixSocketClient.php
<?php
error_reporting(E_ALL);
set_time_limit(0);
$unix_file = '/tmp/server.sock';
// 1. 创建
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if ($socket == FALSE) {
echo 'create fail: ' . socket_strerror(socket_last_error());
}
// 2. 链接
$result = socket_connect($socket, $unix_file);
if ($result == FALSE) {
echo 'connect failed...' . PHP_EOL . PHP_EOL;
} else {
echo 'connect success...' . PHP_EOL . PHP_EOL;
}
$in = 'student ' . (int)$socket . ' come in';
// 3. 向服务端写入
if (!socket_write($socket, $in, strlen($in))) {
echo 'write fail: ' . socket_strerror(socket_last_error());
}
$getMsg = '';
$len = 8129;// 每次读取数据的字节数
// 3. 从服务端读取全部的数据
do {
$out = @socket_read($socket, $len);
$getMsg .= $out;
if (strlen($out) < $len) {
break;
}
} while (true);
echo $getMsg . PHP_EOL;
// 4. 关闭
echo 'close socket...' . PHP_EOL;
socket_close($socket);
echo 'closed ok....';
UnixSocketServer.php
<?php
set_time_limit(0);
$unix_file = '/tmp/server.sock';
static $connList = array();
// 1. 创建
if (($sock = socket_create(AF_UNIX, SOCK_STREAM, 0)) == FALSE) {
echo 'create fail:' . socket_strerror(socket_last_error());
}
// 2. 绑定
if (socket_bind($sock, $unix_file) == FALSE) {
echo 'bind fail:' . socket_strerror(socket_last_error());
}
// 3. 监听
if (socket_listen($sock, 4) == FALSE) {
echo 'listen fail:' . socket_strerror(socket_last_error());
}
$count = 0;
$len = 8129;// 每次读取数据的字节数
do {
// 4. 阻塞,等待客户端请求
if (($msgsock = socket_accept($sock)) == FALSE) {
echo 'accept fail:' . socket_strerror(socket_last_error());
break;
} else {
array_push($connList, (int)$msgsock);
// 5. 读取客户端全部信息
$talkback = '';
do {
$buf = @socket_read($msgsock, $len);
$talkback .= $buf;
if (strlen($buf) < $len) {
break;
}
} while (true);
echo $talkback . PHP_EOL;
// 6. 向客户端写入信息
$msg = "server response " . (int)$msgsock;
socket_write($msgsock, $msg, strlen($msg));
print_r($connList);
echo PHP_EOL;
}
} while (true);
// 6. 关闭socket
socket_close($sock);