网络编程
随着互联网的快速发展,网络应用程序的需求也越来越高。为了使网页更加丰富有趣,许多网站都开始使用套接字(socket)
实现网络的实时通信。而 tcp/ip
协议则常常用于实现此类应用程序。
TCP/IP
协议是一种工业标准协议,是互联网使用最广泛的协议之一。它提供了一种在不同的计算机之间进行数据传输的方式。该协议由两个协议组成:TCP和IP
。其中TCP
协议是面向连接的,可以确保数据的可靠传输。而IP
协议则是面向无连接的,能够处理计算机之间的网络路由。
php网络编程
php
进行网络编程的方式有很多,比如比较出名的swoole
或者workerman
框架。但是这些框架对环境有着一定要求,比如swoole
就不能在windwos
环境下运行。要么只能在服务器上,或者在docker
里面运行。这对于敏捷性开发测试来说,都不希望花大量时间来配置环境。
我们本文介绍的几种网络编程,就十分简单。开箱即用。
tcp服务搭建
reactphp
ReactPHP
是一个用于PHP
中事件驱动编程的低级库。其核心是一个事件循环,在此基础上提供低级实用程序,如:流抽象、异步DNS
解析程序、网络客户端/服务器、HTTP
客户端/服务器以及与进程的交互。第三方库可以使用这些组件来创建异步网络客户端/服务器等。
github:
https://github.com/reactphp/reactphp
本文搭建的tcp服务,基于ReactPHP来实现。
安装
本文使用windows
环境,使用php 8.0.2
composer 2.2.6
- 新建一个文件夹
socket-test
- 切换到
socket-test
文件夹,创建一个composer.json
文件。并输入以下内容
{"require": {"react/socket": "^v1.15.0" }
}
- 在文件夹目录打开命令窗口,输入命令:
composer install
- 新建
index.php
文件。此时目录如下:
- 在
index.php
文件,写入以下代码
require 'vendor/autoload.php';$loop = React\EventLoop\Loop::get();
//监听8090端口
$socket = new React\Socket\SocketServer('127.0.0.1:8090', [], $loop);$socket->on('connection', function ($conn) {echo "New connection\n";// 接收数据$conn->on('data', function ($data) use ($conn) {echo "Received data: " . $data;// 将接收到的数据发送回客户端$conn->write($data);});// 关闭连接处理$conn->on('close', function () use ($conn) {echo "Connection closed\n";});// 错误处理$conn->on('error', function (\Exception $e) use ($conn) {echo "Error: " . $e->getMessage() . "\n";$conn->close();});
});$socket->on('error', function (\Exception $e) {echo "Error: " . $e->getMessage() . "\n";
});$loop->run();
- 在命令行执行以下命令,运行服务。
php .\index.php
- 测试连接,利用
tcp/udp
测试工具,连接刚才监听的端口
收到回复,证明tcp
服务是通的,可以进行tcp
通讯了,可以愉快的开发自己想要的逻辑了。
websocket服务搭建
cboden/ratchet
cboden/ratchet
用于异步服务WebSockets
的PHP
库。通过简单的接口构建应用程序,并通过组合不同的组件在不更改任何代码的情况下重用应用程序。
github:
https://github.com/ratchetphp/Ratchet
安装
在上面的基础上,命令行执行以下命令
composer require cboden/ratchet
- 新建websocket文件,并写入以下代码:
<?php
/*** Created by PhpStorm.* User: MR.Li* Date: 2024/5/6* Time: 16:35*/require 'vendor/autoload.php';//websocket
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;class EchoWebSocket implements MessageComponentInterface {public function onOpen(ConnectionInterface $conn) {// 新连接时会调用$conn->send('hello world');}public function onMessage(ConnectionInterface $conn, $msg) {// 收到消息时调用$conn->send($msg);}public function onClose(ConnectionInterface $conn) {// 连接关闭时调用}public function onError(ConnectionInterface $conn, \Exception $e) {// 发生错误时调用$conn->close();}
}$loop = React\EventLoop\Loop::get();
$webSock = new EchoWebSocket();
$server = IoServer::factory(new HttpServer(new WsServer($webSock)),8090
);$server->run();
- 在命令行执行以下命令,运行服务。
php .\websocket.php
测试
-
用
html
搭建一个websocket
客户端 -
新建一个
webSocketClient.html
,并写入以下代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Go WebSocket Tutorial</title>
</head>
<body>
<h2>Hello World</h2><script>let socket = new WebSocket("ws://127.0.0.1:8090");console.log("Attempting Connection...");socket.onopen = () => {console.log("Successfully Connected");//socket.send('Hi From the Client!')};socket.onclose = event => {console.log("Socket Closed Connection: ", event);//socket.send("Client Closed!")};socket.onerror = error => {console.log("Socket Error: ", error);};socket.onmessage = msg => {console.log("Socket getMsg: ", msg);};/* var int=self.setInterval("clock()",3000);*//*function clock(){// console.log('22222222')socket.send("Hi webcoket")}*/</script>
</body>
</html>
- 在浏览器中打开
webSocketClient.html
。并打开控制面板调试
总结
利用 react/socket
和 cboden/ratchet
两个包可以实现简单的 tcp
和 websoket
服务搭建,操作简单,傻瓜式教程。让新手小白也能用上高大上的网络编程。不用去安装各种扩展,和环境。