1. 程式人生 > >門禁系統socket通訊程式設計

門禁系統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
        ?>

執行檔案返回如圖所示

blob.png

以下是兩個檔案的通訊案例,分別是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

blob.png