찾다
백엔드 개발PHP 튜토리얼PHP 소켓 서버 구축 및 테스트 사례 공유

PHP 소켓 서버 구축 및 테스트 사례 공유

Mar 13, 2018 pm 01:20 PM
phpsocket섬기는 사람

1. 소켓 서버 구축 아이디어

1) 목적: 소켓 서버의 작동 메커니즘 이해

2) 아이디어: 소켓 생성 -> 수신된 정보 -> 핸드셰이크 동작 - > 메시지 보내기

2.socket 서버 코드

참고: PHP 파일에 복사하고 명령줄에서 직접 실행하세요. 다른 지원은 필요하지 않습니다

참고: Chinese_sendMsg를 전송하려면 json_encode가 완료됩니다. ()

<?php/** * Socket服务器 * @author wuchangliang 2018/1/17 */class SocketServer{   
 private $sockets; //连接池    private $master;    private $handshake;    /**     
 * @param $address     * @param $port     */    public function run($address, $port)   
  {        //配置错误级别、运行时间、刷新缓冲区        
  echo iconv(&#39;UTF-8&#39;, &#39;GBK&#39;, "欢迎来到PHP Socket测试服务。 \n");        
  error_reporting(0);        
  set_time_limit(0);       
   ob_implicit_flush();        
   //创建socket        
   $this->master = $this->_connect($address, $port);       
    $this->sockets[] = $this->master;        
    //运行socket        while (true) 
    {            $sockets = $this->sockets;           
     $write = NULL;            $except = NULL;            
     socket_select($sockets, $write, $except, NULL);
      //$write,$except传引用            
      foreach ($sockets as $socket) {                
      if ($socket == $this->master) {                   
       $client = socket_accept($socket);                    
       $this->handshake = false;                    
       if ($client) {                        
       $this->sockets[] = $client; //加入连接池                   
        }                } else {                   
         //接收信息                   
          $bytes = @socket_recv($socket, $buffer, 2048, 0);               
               if ($bytes <= 6) {                       
                $this->_disConnect($socket);                      
                  continue;                   
                   };                  
                     //处理信息              
                           if (!$this->handshake) 
                           {                        
                           $this->_handshake($socket, $buffer);                   
                            } else {                        
              $buffer = $this->_decode($buffer);                       
            $this->_sendMsg($buffer, $socket);                   
        }                }            }        }    }    
 
  /**     * 创建socket连接     * @param $address     * @param $port     * @return resource     */   
                               private function _connect($address, $port)   
 {        //创建socket        
 $master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)        
 or die("socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n");        
 socket_bind($master, $address, $port)        or die("socket_bind() failed: reason: " . 
 socket_strerror(socket_last_error($master)) . "\n");        socket_listen($master, 5)        
 or die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($master)) . "\n");        
 return $master;    }    /**     * 握手动作     * @param $socket     * @param $buffer     */    
 private function _handshake($socket, $buffer)    {        //握手动作信息       
  $buf = substr($buffer, strpos($buffer, &#39;Sec-WebSocket-Key:&#39;) + 18);       
   $key = trim(substr($buf, 0, strpos($buf, "\r\n")));        
   $new_key = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));        
   $new_message = "HTTP/1.1 101 Switching Protocols\r\n";       
    $new_message .= "Upgrade: websocket\r\n";        $new_message .= "Sec-WebSocket-Version: 13\r\n";        
    $new_message .= "Connection: Upgrade\r\n";        $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";        //记录握手动作        socket_write($socket, $new_message, strlen($new_message));        $this->handshake = true;    }    /**     * 断开socket连接     * @param $socket     */    private function _disConnect($socket)    {        $index = array_search($socket, $this->sockets);        socket_close($socket);        if ($index >= 0) {            array_splice($this->sockets, $index, 1);        }    }    /**     * 发送信息     * @param $buffer     * @param $client     */    private function _sendMsg($buffer, $client)    
    {        $send_buffer = $this->_frame(json_encode($buffer));        foreach ($this->sockets as $socket) {            if ($socket != $this->master && $socket != $client) { //广播发送(除了自己)                socket_write($socket, $send_buffer, strlen($send_buffer));        
        }        }    }    /**     * 解析数据帧    
     * @param $buffer     * @return null|string     */    private function _decode($buffer)    {        $len = $masks = $data = $decoded = null;    
        $len = ord($buffer[1]) & 127;        if ($len === 126) {            $masks = substr($buffer, 4, 4);           
     $data = substr($buffer, 8);        } else if ($len === 127) {            $masks = substr($buffer, 10, 4);            
    $data = substr($buffer, 14);        } else {            $masks = substr($buffer, 2, 4);            $data = substr($buffer, 6);        }    
        for ($index = 0; $index < strlen($data); $index++) {            $decoded .= $data[$index] ^ $masks[$index % 4];        }     
       return $decoded;    }    /**     * 处理返回帧     * @param $buffer     * @return string     */    private function _frame($buffer)   
     {        $len = strlen($buffer);        if ($len <= 125) {            return "\x81" . chr($len) . $buffer;        } else if ($len <= 65535)
     {            return "\x81" . chr(126) . pack("n", $len) . $buffer;        } else 
    {            return "\x81" . char(127) . pack("xxxxN", $len) . $buffer;        }    }}$sc = new SocketServer();$sc->run(&#39;127.0.0.1&#39;, 2046);

3. 클라이언트 코드

참고: 위의 PHP 파일과 동일한 폴더에 html로 직접 복사하십시오. onmessage

<!DOCTYPE html><html><head>    <meta charset="utf-8" />    <title>WebSocket Test</title>    <script language="javascript"type="text/javascript">        websocket = new WebSocket(&#39;ws://127.0.0.1:2046/&#39;);        websocket.onopen = function(evt) {            console.log(&#39;connect&#39;);            websocket.send(&#39;{"data":"您好,世界!"}&#39;);        };        websocket.onclose = function(evt) {            console.log(&#39;onclose&#39;);            console.log(evt);        };        websocket.onmessage = function(evt) {            console.log(&#39;onmessage&#39;);            if (evt.data) {                console.log(JSON.parse(JSON.parse(evt.data)));            }        };        websocket.onerror = function(evt) {            console.log(&#39;onerror&#39;);            console.log(evt);        };        function sendMsg(){            var sendData = { &#39;data&#39;: document.getElementById(&#39;name&#39;).value};            websocket.send(JSON.stringify(sendData));        }    </script></head><body>    <h2 id="WebSocket-nbsp-Test">WebSocket Test</h2>    <input type="text" name="name" id="name" />    <a href="javascript:;" onclick="sendMsg()">点击发送</a></body></html>

4. 테스트 예


관련 권장 사항:

PHP에서 소켓을 사용하는 간단한 방법

PHP에서 소켓 서버 설정 및 테스트에 대한 자습서

소켓 푸시 기술의 PHP 구현에 대한 자세한 설명

위 내용은 PHP 소켓 서버 구축 및 테스트 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP는 사용자 세션을 어떻게 식별합니까?PHP는 사용자 세션을 어떻게 식별합니까?May 01, 2025 am 12:23 AM

phpidifiesauser의 sssessionusessessioncookiesandssessionids.1) whensession_start () iscalled, phpgeneratesauniquessessionStoredInacookienamedPhpsSessIdonSeuser 'sbrowser.2) thisidallowsphptoretrievessessionDataTromServer.

PHP 세션을 확보하기위한 모범 사례는 무엇입니까?PHP 세션을 확보하기위한 모범 사례는 무엇입니까?May 01, 2025 am 12:22 AM

PHP 세션의 보안은 다음 측정을 통해 달성 할 수 있습니다. 1. Session_REGENEREAT_ID ()를 사용하여 사용자가 로그인하거나 중요한 작업 일 때 세션 ID를 재생합니다. 2. HTTPS 프로토콜을 통해 전송 세션 ID를 암호화합니다. 3. 세션 _save_path ()를 사용하여 세션 데이터를 저장하고 권한을 올바르게 설정할 보안 디렉토리를 지정하십시오.

PHP 세션 파일은 기본적으로 어디에 저장됩니까?PHP 세션 파일은 기본적으로 어디에 저장됩니까?May 01, 2025 am 12:15 AM

phpsessionfilesarestoredInTheRectorySpecifiedBysession.save_path, 일반적으로/tmponunix-likesystemsorc : \ windows \ temponwindows.tocustomizethis : 1) austession_save_path () toSetacustomDirectory, verlyTeCustory-swritation;

PHP 세션에서 데이터를 어떻게 검색합니까?PHP 세션에서 데이터를 어떻게 검색합니까?May 01, 2025 am 12:11 AM

toretrievedatafromAphPsession, startSessionstart_start () andaccessvariblesinthe $ _sessionArray.forexample : 1) startthessession : session_start (). 2) retrievedata : $ _ session [ 'username']; echo "Welcome,". $ username;

세션을 사용하여 쇼핑 카트를 구현할 수있는 방법은 무엇입니까?세션을 사용하여 쇼핑 카트를 구현할 수있는 방법은 무엇입니까?May 01, 2025 am 12:10 AM

세션을 사용하여 효율적인 쇼핑 카트 시스템을 구축하는 단계에는 다음이 포함됩니다. 1) 세션의 정의와 기능을 이해합니다. 세션은 요청에 따라 사용자 상태를 유지하는 데 사용되는 서버 측 스토리지 메커니즘입니다. 2) 쇼핑 카트에 제품 추가와 같은 기본 세션 관리를 구현합니다. 3) 제품 수량 관리 및 삭제 지원 고급 사용으로 확장; 4) 세션 데이터를 지속하고 보안 세션 식별자를 사용하여 성능 및 보안을 최적화합니다.

PHP에서 인터페이스를 어떻게 생성하고 사용합니까?PHP에서 인터페이스를 어떻게 생성하고 사용합니까?Apr 30, 2025 pm 03:40 PM

이 기사는 PHP의 인터페이스를 생성, 구현 및 사용하는 방법을 설명하여 코드 구성 및 유지 관리에 대한 이점에 중점을 둡니다.

crypt ()와 password_hash ()의 차이점은 무엇입니까?crypt ()와 password_hash ()의 차이점은 무엇입니까?Apr 30, 2025 pm 03:39 PM

이 기사에서는 PHP의 암호 해싱에 대한 Crypt ()와 Password_hash ()의 차이점에 대해 논의하여 최신 웹 애플리케이션에 대한 구현, 보안 및 적합성에 중점을 둡니다.

PHP의 크로스 사이트 스크립팅 (XSS)을 어떻게 방지 할 수 있습니까?PHP의 크로스 사이트 스크립팅 (XSS)을 어떻게 방지 할 수 있습니까?Apr 30, 2025 pm 03:38 PM

기사는 입력 유효성 검사, 출력 인코딩 및 OWASP ESAPI 및 HTML 청정기와 같은 도구를 통해 PHP의 크로스 사이트 스크립팅 (XSS) 방지에 대해 논의합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.