NoteDeep

server.php

<?php set_time_limit(0); function getError() { return socket_strerror(socket_last_error()); } //设置IP和端口号 $address = "127.0.0.1"; $port = 2046; /** * socket 是一个通讯节点。 * 创建一个套接字(通讯节点) * AF_INET IPv4: 网络协议。TCP 和 UDP 都可使用此协议。 * * SOCK_STREAM: 提供一个顺序化的、可靠的、全双工的、基于连接的字节流。支持数据传送流量控制机制。TCP 协议即基于这种流式套接字。 * * SOL_TCP:Transmission Control Protocol 是一个可靠的、基于连接的、面向数据流的全双工协议。 * TCP 能够保障所有的数据包是按照其发送顺序而接收的。如果任意数据包在通讯时丢失,TCP 将自动重发数据包直到目标主机应答已接收。 * 因为可靠性和性能的原因,TCP 在数据传输层使用 8bit 字节边界。因此,TCP 应用程序必须允许传送部分报文的可能。 */ $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$sock) { die("socket_create() 失败的原因是:" . getError() . "/n"); } //设置为阻塞模式 if (!socket_set_block($sock)) { die("socket_set_block() 失败的原因是:" . getError() . "/n"); } //给套接字绑定名字, 绑定到socket端口 if (!$result = socket_bind($sock, $address, $port)) { die("socket_bind() 失败的原因是:" . getError() . "/n"); } //开始监听, Listens for a connection on a socket if (!$result = socket_listen($sock, 4)) { die("socket_listen() 失败的原因是:" . getError() . "/n"); } echo "OK\nBinding the socket on $address:$port ... "; echo "OK\nNow ready to accept connections.\nListening on the socket ... \n"; do { // never stop the daemon(守护进程) /** * Accepts a connection on a socket 。(在通讯节点上接收连接) * 一旦连接成功,返回一个新的socket资源,可用于通信。(也就是这里的 $msgsock) * 如果socket 上有多个连接排队,则会使用第一个连接。 * 如果没有正在等待的连接, * 且是阻塞模式,socket_accept() 方法将会阻塞,直到一个连接出现。 * 非阻塞模式,If socket has been made non-blocking using socket_set_blocking() or socket_set_nonblock(), FALSE will be returned. */ if (!$msgsock = socket_accept($sock)) { die("socket_accept() failed: reason: " . getError() . "/n"); } //读取客户端数据 echo "Read client data \n"; /** * 从socket读取最大长度字节。 * socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符. */ $buf = socket_read($msgsock, 8192); echo "Received msg: $buf \n"; $msg = "welcome \n"; /** * 数据传送 向客户端写入返回结果 */ if (!socket_write($msgsock, $msg, strlen($msg))) { die("socket_write() failed: reason: " . getError() ."/n"); } //一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止 socket_close($msgsock); } while (true); socket_close($sock);

client.php

<?php set_time_limit(0); $host = "127.0.0.1"; $port = 2046; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n"); // 创建一个Socket /** * 用 socket_create() 创建的有效的套接字资源(通讯节点) 来连接到 address */ if (!socket_connect($socket, $host, $port)) { die("Could not connet server\n"); } // 数据传送 向服务器发送消息 socket_write($socket, "hello socket") or die("Write failed\n"); while ($buff = @socket_read($socket, 1024, PHP_NORMAL_READ)) { echo("Response was:" . $buff . "\n"); } socket_close($socket);

评论列表

    server.php
    client.php