<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                <span style="color:blue">**socket_accept**</span>(resource **$socket**) :resource 客戶端通過socket_connect開啟一個套接字連接,服務端則通過此函數socket_accept接受客戶端的鏈接,它的參數是服務端的套接字 成功返回套接字的信息資源,失敗為false,默認是阻塞的他會一直等待客戶端的socket_connect鏈接成功連接后返回客戶端的套接字 如果有多個客戶端等待連接則先與第一個客戶端通信,其他會阻塞的等待著。如果`socket`已使用[socket\_set\_blocking()](https://www.php.net/manual/en/function.socket-set-blocking.php)或[socket\_set\_nonblock()](https://www.php.net/manual/en/function.socket-set-nonblock.php)進行了非阻塞,則將返回**`FALSE`**可以通過調用[socket\_last\_error()](https://www.php.net/manual/en/function.socket-last-error.php)來檢索實際的錯誤代碼。可以將此錯誤代碼傳遞給[socket\_strerror()](https://www.php.net/manual/en/function.socket-strerror.php)以獲得錯誤的文本說明 ![](https://img.kancloud.cn/32/54/325416ac992c75d9988b46f3514f8aea_489x482.png) cli執行php server.php后是阻塞狀態,不會輸出111 ``` $socket=socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); socket_bind($socket,'127.0.0.1',8080); socket_listen($socket,4); $client_socket = socket_accept($socket); //默認阻塞的,代碼在這停留,除非接受到客戶端通過socket_connect的開啟一個套接字連接請求才會往下執行 echo 111; ``` 開啟非阻塞后不在阻塞的的等待客戶端的鏈接了,而是直接執行下面的代碼 cli執行php server.php后直接輸出111 ``` $socket=socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); socket_bind($socket,'127.0.0.1',8080); socket_listen($socket,4); socket_set_nonblock($socket); $client_socket = socket_accept($socket); //默認阻塞的,代碼在這停留,除非接受到客戶端通過socket_connect的開啟一個套接字連接請求才會往下執行 echo 111; ``` 由上面的例子可以看出多個客戶端連接時,需要通過while(true)循環檢測客戶端的鏈接 ``` //如果要在一臺服務器上有多個客戶端,則必須使用非阻塞 $clients = array(); $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_bind($socket,'127.0.0.1',$port); socket_listen($socket); socket_set_nonblock($socket); while(true) { if(($newc = socket_accept($socket)) !== false) { echo "Client $newc has connected\n"; $clients[] = $newc; } } ``` 例子2: ``` //服務端腳本,server_socket.php  //創建服務端的socket套接流,net協議為IPv4,protocol協議為TCP $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /*綁定接收的套接流主機和端口,與客戶端相對應*/ if(socket_bind($socket,'127.0.0.1',8888) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /*這里的127.0.0.1是在本地主機測試,你如果有多臺電腦,可以寫IP地址*/ } //監聽套接流 最大監聽4個套接流 if(socket_listen($socket,4)==false){ echo 'server listen fail:'.socket_strerror(socket_last_error()); } //讓服務器無限獲取客戶端傳過來的信息 do{ /*接收客戶端傳過來的信息*/ $accept_resource = socket_accept($socket); /*socket_accept的作用就是接受socket_bind()所綁定的主機發過來的套接流*/ if($accept_resource !== false){ /*讀取客戶端傳過來的資源,并轉化為字符串*/ $string = socket_read($accept_resource,1024); /*socket_read的作用就是讀出socket_accept()的資源并把它轉化為字符串*/ echo 'server receive is :'.$string.PHP_EOL;//PHP_EOL為php的換行預定義常量 if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /*向socket_accept的套接流寫入信息,也就是回饋信息給socket_bind()所綁定的主機客戶端*/ socket_write($accept_resource,$return_client,strlen($return_client)); /*socket_write的作用是向socket_create的套接流寫入信息,或者向socket_accept的套接流寫入信息*/ }else{ echo 'socket_read is fail'; } /*socket_close的作用是關閉socket_create()或者socket_accept()所建立的套接流*/ socket_close($accept_resource); } }while(true); socket_close($socket); //請注意上面的socket_bind,socket_listen,socket_accept三個函數的執行順序不可更改 //客戶端腳本,client_socket.php //創建一個socket套接流 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /****************設置socket連接選項,這兩個步驟你可以省略*************/ //接收套接流的最大超時時間1秒,后面是微秒單位超時時間,設置為零,表示不管它 socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0)); //發送套接流的最大超時時間為6秒 socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0)); /****************設置socket連接選項,這兩個步驟你可以省略*************/ //連接服務端的套接流,這一步就是使客戶端與服務器端的套接流建立聯系 if(socket_connect($socket,'127.0.0.1',8888) == false){ echo 'connect fail massege:'.socket_strerror(socket_last_error()); }else{ $message = 'l love you 我愛你 socket'; //轉為GBK編碼,處理亂碼問題,這要看你的編碼情況而定,每個人的編碼都不同 $message = mb_convert_encoding($message,'GBK','UTF-8'); //向服務端寫入字符串信息 if(socket_write($socket,$message,strlen($message)) == false){ echo 'fail to write'.socket_strerror(socket_last_error()); }else{ echo 'client write success'.PHP_EOL; //讀取服務端返回來的套接流信息 while($callback = socket_read($socket,1024)){ echo 'server return message is:'.PHP_EOL.$callback; } } } socket_close($socket);//工作完畢,關閉套接流 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看