PHP如何实现简单的Socket

PHP如何实现简单的 Socket

本篇文章简单说下PHP如何实现简单的Socket。主要以代码为例。

首先使用PHP制作的 Socket 服务端,其主要是设置 Socket 的 IP 地址及端口号;然后监听端口,如果有客户端连接的话,则接收连接请求和数据,最后处理数据并且返回数据即可。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
// 确保在连接客户端时不会超时
set_time_limit(0);
// 设置IP和端口
$address = '127.0.0.1';
$port = 2048; // 调试的时候,可以换端口来调试程序

/**
* 创建一个SOCKET
* AF_INET是 ipv4, 如果用ipv6,则参数为 AF_INET6
* SOCKET_STREAM为 socket 的 tcp 类型,如果是 UDP 则使用 SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('socket_create()失败的原因是:' . socket_strerror(socket_last_error()) . "\n");

// 阻塞模式
socket_set_block($sock) or die('socket_set_lock()失败的原因是:' . socket_strerror(socket_last_error()) . "\n");

// 绑定到socket端口
$result = socket_bind($sock, $address, $port) or die('socket_bind()失败的原因是:' . socket_strerror(socket_last_error()) . "\n");

// 开始监听
$result = socket_listen($sock, 4) or die('socket_listen()失败的原因是:' . socket_strerror(socket_last_error()) . "\n");

echo "OK\n Binding the socket on {$address}:{$port} Successed!...";
echo "OK\n Now ready to accept connections.\nListening on the socket...\n";

do { // 从不停止后台运行
// 这里接收连接请求并调用一个子连接 Socket 来处理客户端和服务端间的信息
$msgsock = socket_accept($sock) or die('socket_accept() failed! reason:' . socket_strerror(socket_last_error()) . "\n");

// 读取客户端数据
echo "Read client data\n";
// socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符。PHP脚本把这些字符看做是输入的结束符
$buf = socket_read($msgsock, 8192);
echo "Received msg from client: {$buf}\n";

// 数据传送 向客户端写入返回结果
$msg = "welcome \n";
socket_write($msgsock, $msg, strlen($msg)) or die('socket_write() failed! reason:' . socket_strerror(socket_last_error()) . "\n");
// 一旦输出被返回到客户端,父/子socket都应该通过 socket_close($msgsocket)函数来终止
socket_close($msgsock);
} while (true);
socket_close($sock);

然后我们可以通过 tcp 客户端:(telnet工具进行测试)

1
telnet 127.0.0.1 2048

发送数据给服务端,服务端返回数据给客户端,然后关闭这个客户端的连接。

以上就是PHP如何实现简单的Socket的详细内容。

文章目录
  1. 1. PHP如何实现简单的 Socket
本站总访问量 | 本页面被访问 | 您是第位小伙伴

© 炫彩信息科技有限公司 版权所有 备案号 : 赣ICP备19008485号