溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用PHP進(jìn)行socket套節(jié)字的連接

發(fā)布時間:2020-07-14 10:54:57 來源:億速云 閱讀:143 作者:Leah 欄目:編程語言

如何使用PHP進(jìn)行socket套節(jié)字的連接?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

socket通常也稱作"套接字",用于描述IP地址和端口 , 是一個通信鏈的句柄。應(yīng)用程序通常通過“套接字”先服務(wù)器發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。

根據(jù)鏈接啟動的方式以及本地套接字要連接的目標(biāo) , 套節(jié)字之間的連接過程可以分為三個步驟:

1、服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字 , 而是處于等待連接的狀態(tài) ,實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài)。

2、客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先面熟它要連接的服務(wù)器的套接字,指出服務(wù)器套接字的地址和端口號 , 然后就像服務(wù)器端套接字提出連接請求。

3、連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,他就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端 , 一旦客戶確認(rèn)了此描述 , 連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端接字的鏈接請求。

一、測試環(huán)境:

  服務(wù)器ip:xxx.xxx.xxx.1

  客戶端ip: xxx.xxx.xxx.2

二 、測試過程:

  客戶端服務(wù)器將在本機(jī)(xxx.xxx.xxx.1)通過socket發(fā)送數(shù)據(jù)到服務(wù)端(xxx.xxx.xxx.2)的socket服務(wù)器上,服務(wù)端收到客戶端發(fā)送的數(shù)據(jù)后返回一些給客戶端.

三、服務(wù)端文件內(nèi)容:  

<?php
  //獲取tcp協(xié)議號嗎.
  $tcp = getprotobyname("tcp");
  //建立server端socket , 創(chuàng)建并返回一個套接字,也稱做一個通訊節(jié)點(diǎn).一個典型的網(wǎng)絡(luò)連接由2個套接字構(gòu)成 , 一個運(yùn)行在客戶端 , 另一個運(yùn)行在服務(wù)器端.
  $socket = socket_create(AF_INFT , SOCK_STREAM , $tcp);
  //綁定要監(jiān)聽的ip和端口 , 這里綁定的ip一定要寫局域網(wǎng)ip , 寫成127.0.0.1客戶端將無法與服務(wù)器端建議連接.
  socket_bind($socket , 'xxx.xxx.xxx.1' , 10008);
  //監(jiān)聽端口
  socket_listen($socket);
  //初始化一個數(shù)據(jù) , 和客戶端通信
  $buffer = "connect";
  while(true){
    //接受客戶端請求過來的yigesocket連接
    $connection = socket-accept($scoket);
    if(!connection){
      echo "connect faild";
    } else {
    echo "Socket connected \n";
    //向客戶傳遞一個信息數(shù)據(jù)
   if($buffer != ""){
    echo "send data to client\n";
    socket_write($connection , $buffer , "\n");
    echo "Wrote to socket\n";    
} else {
    echo "no data in the buffer\n";
}   
  //從客戶端獲取得的數(shù)據(jù)
  while($data = $socket_read($connection , 1024 , PHP_NORMAL_READ)){
  printf("Buffer:".$data.'\n');
  //取得信息給客戶端一個反饋 ,Thank you client , you data is Received success發(fā)給客戶端的回應(yīng)信息.
  socket-wirte($coennection , "Thank you client , you data is Received success \n");
}
}
//關(guān)閉sockket
socket_close($connection);
printf("Closed the socket\n");
  
  }
?>

四、客戶端文件內(nèi)容:

<?php
  //建立客戶端的socket連接
  $socket = se);
  //連接服務(wù)器端socket
  $connection = socket_connect($socket , 'xxx.xxx.xxx.1' , 10008);
  //要求發(fā)送到服務(wù)端的信息.
  $send_data = "This data will Send to server!";
  //客戶端去連接服務(wù)端并接受服務(wù)端返回的數(shù)據(jù) , 如果返回的數(shù)據(jù)保護(hù)not connect就提示不能連接.
  while($buffer = @socket_read($socket , 1024,PHP_NORMAL_READ)){
    if(preg_match("/not connect/" , $buffer)){
    echo "don't connect\n";
    break;
  } else {
  //服務(wù)端傳來的信息
  echo "Buffer Data: ".$buffer .'\n';
  echo "Writing to Socket\n";
  //將客戶的信息寫道通道中 , 傳給服務(wù)器端
  if(!socket_write($socket , "$send_data\n")){
     echo "Write failed\n";
  }
  //服務(wù)器端收到信息后 , 客戶端接受服務(wù)端傳給客戶端的回應(yīng)信息.
  while($buffer = socket_read($socket , 1024 , PHP_NORMAL_READ)){
    echo "send to server: $send-data\n response from server was:".$buffer."\n";
  }
  }
  }
?>

五、在服務(wù)端socket服務(wù)啟動進(jìn)程。

#/usr/local/php/bin/php -a/home/server.php
Interactive mode enable 互動模式啟動

六、服務(wù)端啟動后查看啟動的進(jìn)程及端口

#netstat -tnlp |grep 10008
tcp   0  0 192.168.13:10008  0.0.0.0:*  LISTEN
28892/php

七、在客戶端(192.168.1.2)上執(zhí)行傳輸

#/usr/local/php/bin/php -a client.php
Interactive mode enabled

八、回到服務(wù)器端上查看接受到的信息。

#/usr/local/php/bin/php -a /home/server.php
Interactive mode enabled
 
Socket connected
send data client
Wrote to socket
Buffer:This data will Send to server!

關(guān)于 如何使用PHP進(jìn)行socket套節(jié)字的連接問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI