# 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
服务端信息:
![](https://box.kancloud.cn/69d4077d8796f1c12e9f412de57f6447_498x50.png)
客户端信息:
![](https://box.kancloud.cn/db6b6ef2f1a3c24858044602ba2b209a_479x81.png)
注:
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算法