# socket_accept
* * * * *
說明:
> 接受一個套接字連接,成功返回一個新的套接字的信息資源,失敗返回false
語法:
~~~
resource socket_accept ( resource $socket )
~~~
參數:
| 參數 | 描述 |
| --- | --- |
| socket | 一個由 socket_create() 創建的有效的資源套接字 |
返回值:
| 成功 | 失敗 |
| --- | --- |
| 返回一個新的socket套接字資源 (resource數據類型) | false |
技術細節:
PHP版本:PHP 4 >= 4.1.0, PHP 5, PHP 7
實例:
服務端代碼 server.php
~~~
//創建服務端的socket套接流,net協議為IPv4,protocol協議為TCP
if (!$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
echo ("create socket 失敗: " . socket_strerror(socket_last_error()) and socket_clear_error());
exit;
}
/*給socket綁定主機和端口(設置socket套接字資源地址),這樣客戶端才能通過主機和端口連接*/
socket_bind($socket, '127.0.0.1', '8080');
//監聽套接流
socket_listen($socket);
// 獲取服務端的 地址 和端口
socket_getsockname($sockets[0], $addr, $port);
echo '服務端ip:' . ($addr) . PHP_EOL;
echo '服務端端口:' . ($port) . PHP_EOL;
//設置套接流為非阻塞
socket_set_nonblock($socket);
//循環,讓服務器無限獲取客戶端傳過來的信息
while (true) {
//接受套接字連接 成功返回一個新的socket套接流
if (($new_socket = socket_accept($socket)) !== false) {
// 獲取客戶端的 地址 和端口
socket_getpeername($new_socket, $addr, $port);
echo '客戶端ip:' . ($addr) . PHP_EOL;
echo '客戶端端口:' . ($port) . PHP_EOL;
//讀取客戶端傳過來的資源,并轉化為字符串
$string = socket_read($new_socket, 1024);
echo '客戶端發來信息:' . $string . PHP_EOL;//PHP_EOL為php的換行預定義常量
if ($string != false) {
// 返回給客戶端的信息
$return_message = 'hello,我來自服務器端' . PHP_EOL;
// 向socket_accept的套接流寫入信息
socket_write($new_socket, $return_message, strlen($return_message));
//關閉socket_create()或者socket_accept()所建立的套接流
socket_close($new_socket);
}
}
}
socket_close($socket);
~~~
客戶端代碼 client.php
~~~
//創建一個socket套接流
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//連接上面服務端的套接流
if (socket_connect($socket, '127.0.0.1', '8080') == false) {
echo '連接失敗信息:' . socket_strerror(socket_last_error());
} else {
$message = 'hello ,我是客戶端';
//向服務端寫入字符串信息
if (socket_write($socket, $message, strlen($message)) == false) {
echo '寫入失敗信息:' . socket_strerror(socket_last_error()) and socket_clear_error();
} else {
echo '客戶端發送信息成功' . PHP_EOL;
//讀取服務端返回來的套接流信息
while ($callback = socket_read($socket, 1024)) {
echo '服務端返回的信息是:' . PHP_EOL . $callback;
}
}
}
socket_close($socket);//工作完畢,關閉套接流
~~~
打開windows的cmd窗口,然后,運行php server.php
再打開另外一個cmd窗口 ,然后,運行php client.php
服務端信息:

客戶端信息:

注:
1、windows中需要把 php這個運行命名 加入環境變量中
2、需要在php.ini 開啟extension=sockets 模塊
資料來源:
http://php.net/manual/zh/book.sockets.php
https://www.cnblogs.com/loveyoume/p/6076101.html
- 前言
- 函數參考
- Socket 函數
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔術方法
- 魔術常量
- 雜項
- backlog的用處
- new self()和new static()的區別
- PHP變量的生命周期
- PHP抽象類
- 對象接口
- PHP中的常用關鍵字
- 常量
- 內存泄露
- global 與 $GLOBAL
- 簡單說明CGI和動態請求是什么
- 設計模式
- 單例模式
- 工廠模式
- 適配器模式
- 策略模式
- 觀察者模式
- 控制反轉IoC簡介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面試
- 數據庫相關
- 語句相關
- 索引相關
- 字段相關
- PHP相關
- 字符串相關
- 函數相關
- 運算符優先級相關
- 錯誤相關
- redis相關
- 10個常見的Redis面試"刁難"問題
- mysql
- MySQL中的鎖
- MySQL存儲引擎MyISAM 和 InnoDB的區別
- MySQL半同步復制
- explain 命令詳解
- 索引
- 數據庫事務
- MySQL和B樹的那些事
- git
- github----向開源框架提交pr的過程
- 推薦博客
- linux
- 命令
- free
- 高并發
- 搶購/秒殺功能
- 算法
- 一致性Hash算法