您的位置 首页 php

门禁系统socket通讯编程

最近遇到一个socke udp协议通讯的需求,而且是16进制数据接收。这样在传输参数的时候老是提示参数错误,因为计算机是不能直接传输16进制的,会自行转换,所有以下代码非常完美的解决我的问题,同时也让我认识到并不是所有 socket 都是需要一个客户端和服务端代码

<?php
 $sendStr = '01 49 03 01 01 00 4B'; // 16进制数据01 49 03 01 01 00 4B
 $sendStrArray = str_split(str_replace(' ', '', $sendStr), 2); // 将16进制数据转换成两个一组的数组
 $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
 // $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("udp")); // 创建Socket
 if (socket_connect($socket, "192.168.16.254", 8080)) { //连接
 for ($j = 0; $j < count($sendStrArray); $j++) {
 socket_write($socket, chr(hexdec($sendStrArray[$j]))); // 逐组数据发送
 }
 $receiveStr = "";
 $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ); // 采用2进制方式接收数据
 $receiveStrHex = bin2hex($receiveStr); // 将2进制数据转换成16进制
 echo "client:" . $receiveStrHex;
 }
 socket_close($socket); // 关闭Socket
 ?> 

运行文件返回如图所示

以下是两个文件的通讯案例,分别是udp_s.php和udp_c.php分别是服务端和客户端

udp_s.php文件

<?php
 error_reporting( E_ALL );
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
if ( $socket === false ) {
 echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";
}
$ok = socket_bind( $socket, '127.0.0.1', 8080 );
if ( $ok === false ) {
 echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
}
while ( true ) {
 $from = "";
 $port = 0;
 socket_recvfrom( $socket, $buf,1024, 0, $from, $port );
 echo $buf;
 usleep( 1000 );
} 

udp_c.php文件

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$ msg  = "hello";
$len = strlen($msg);
socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 8080);
socket_close($sock); 

运行文件如下,没刷新下udp_test.php文件,cmd打印出一个hello

文章来源:智云一二三科技

文章标题:门禁系统socket通讯编程

文章地址:https://www.zhihuclub.com/79344.shtml

关于作者: 智云科技

热门文章

网站地图