websocke和基于swoole的异步通信

nodejs+php用socket(TCP)互通 目的:nodejs和php通讯 实现:通过socket协议tcp使nodejs和php相互通讯! 首先  nodejs建立http服务器,然后建立tcp监听(用作client),然后php建立tcp服务器 源代码: var http = require('http'); http.createServer(function (req, res) { // res.writeHead(20 阅读详情
一、概述

  WebSocket 协议是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

  在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。

  WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

二、HTML5+NodeJs实现WebSocket即时通讯

参考:http://www.cnblogs.com/axes/p/3586132.html

准备知识:

  1. 服务器端语言:nodeJs(类似PHP)

  2. nodeJs 管理包工具 npm(类似composer)

    步骤1:安装nodejs
    步骤2:安装npm(淘宝镜像http://npm.taobao.org并定制命令cnpm)
    步骤3:在cmd运行初始化命令: npm init
    步骤4:安装nodeJs的模块nodejs-websocke,运行命令:cnpm install nodejs-websocket
    安装成功

    步骤5:将websocket包的监听js代码放到test.js,包网站:https://www.npmjs.com/package/nodejs-websocket

    步骤6:运行node test.js

    步骤7:打开game1、game2

game1.html

game2.html

这里写图片描述

三、基于Swoole的websocket
web聊天UI
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>聊天会话</title>

    <style>
        #content .left{
            text-align: left;
        }
        #content .right{
            text-align: right;
        }
    </style>
</head>

<body>
<div id="cc" style="width:700px;">
    发送用户id:<input type="text" name="user" >
    接收用户id:<input type="text" name="to_user" >
    <button class="login">登录</button>
    <div id="content" style=" height:400px; overflow:auto; width:100%; border:1px solid #ccc;"></div>
    <form id="form">
        <textarea id="texts" style="width:100%; height:200px;"></textarea>
        <input type="button" onclick="ab();" value="发送">
    </form>
</div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

    var uid,toUid;

    $('.login').on('click' , function(){
        uid = $('[name=user]').val().trim();
        toUid = $('[name=to_user]').val().trim();
        if(uid == '' || toUid == ''){
            alert('请先登录');
        }else{
            aa(uid ,toUid );
        }
    })


    var socket;

    function aa(uid , toUid )
    {

        socket=new WebSocket('ws://192.168.82.31:9502?uid=' + uid );

        socket.onopen=function()
        {
            console.log('用户id:' , uid);
            var msg = setMsg(1 , '链接成功' , uid  , toUid ) ;
            console.log(msg);
            socket.send( msg );
        }

        socket.onmessage=function(msg)
        {
            $('#content').append('<p class="b left"> '+msg.data+'</p>');
        }

        socket.onclose= function()
        {
            $('#content').append('<p class="c">退出聊天室</p>');
        }
    }

    function ab()
    {
        var msg = $('#texts').val();
        var sendmsg = setMsg( 2 , msg , uid , toUid );
        socket.send( sendmsg );
        $('#content').append('<p class="b right">'+msg+': 我(uid:'+uid+')</p>');
        $('#texts').val('');
    }

    function az()
    {
        socket.close();
        socket=null;
    }


    function setMsg( type , msg , uid ,toUid ){
        var msgObject = {
            type : type ,
            msg: msg ,
            uid: uid ,
            to_uid: toUid
        }
        return JSON.stringify(msgObject);
    }
</script>
</body>
</html>
服务端开启监听websocket事件
<?php
// server.php 
// 所有登录用户的fd
$userFdList = [];
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) use (&$userFdList) {

	$userFdList[$request->get['uid']] = $request->fd ;
	//var_dump($request);
    //var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "系统:hello, welcome\n");
    // echo '所有正在连接的用户:';
    // print_r($userFdList);
});

//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) use (&$userFdList) {
	echo '所有正在连接的用户:';
    print_r($userFdList);
	echo 'Message:<pre>';
	$data = json_decode($frame->data , true);
    print_r($data);

    if($data['type'] == 1){
    	$ws->push($userFdList[$data['uid']], "系统:{$data['msg']}");
    } else if( !isset($userFdList[$data['to_uid']])) {
    	$ws->push($userFdList[$data['uid']], "系统:用户没上线");
    } else {
    	$ws->push($userFdList[$data['to_uid']], "别人(uid:{$data['uid']}):{$data['msg']}");
    }
    
});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) use (&$userFdList) {

	foreach ($userFdList as $key => $value) {
		if( $value == $fd ) unset($userFdList[$key]);
	}
    echo "client-{$fd} is closed\n";
});

$ws->start();

  1. 在服务端开启监听:php server.php ;( php必须支持swoole )
  2. 在浏览器登录账号:
    在这里插入图片描述
在服务端监听成功:

在这里插入图片描述

在另一浏览器窗口登录另一个账号:

在这里插入图片描述

以上步骤就实现简单的web聊天功能,两个浏览器之间可以互发消息
C++语言的WebSocket WebSocket是一种网络技术,允许客户端与服务器之间建立持久的连接,以实现实时的数据交换。与HTTP请求/响应模型相比,WebSocket可以在建立连接后进行多次数据交换,而不需要重新建立连接。WebSocket协议在数据传输时采用二进制帧和文本帧,支持双向通信,使得服务器可以主动向客户端推送数据,极大地提升了通信效率。是一个C++库,专门用于实现WebSocket客户端和服务器。轻量级且高效支持多线程易于集成进现有C++项目。 阅读详情

相关推荐

WebSocket协议介绍与C++实现

WebSocket协议建立在HTTP协议之上,首先通过一个HTTP请求来进行握手。一旦握手完成,客户端和服务器之间的连接会被“升级”到WebSocket协议,之后通信不再依赖HTTP,而是直接使用WebSocket协议。

ye_yumo的博客 1835

使用 Swoole 的 HTTP 服务实现简单的请求调度

本文是我练习代码的整理总结,水平有限,仅供参考。 下面是程序的入口,创建了一个 HTTP 协程服务,调用 App 类实现请求调度。 namespace server; use app\App; // 我的 php-ini 中关闭了短命名,所以此处定义了两个别名 use Swoole\Coroutine as Co; function go($callable) { Co::create($callable); } // 创建协程容器 Co\run(function () { //

weixin_40369062的博客 919

WorkBuddy入门到 多Agent团队协作完全指南(附实操代码与配图)

WorkBuddy的Agent Teams功能支持多智能体协作,通过创建AI团队提升复杂任务处理效率。该功能支持自然语言创建团队、任务分配与依赖管理、成员间消息通信(包括直接消息和广播),并提供任务审批机制。典型应用场景包括软件开发、内容创作等协作任务。环境要求WorkBuddy 2026年3月及以上版本,支持Windows和macOS系统。用户可快速创建包含不同角色的AI团队,通过共享任务列表和信箱系统实现协作。高级功能包括委派模式、任务依赖管理和成员自主认领等,适合各类协作场景。

三棱球的专栏 6485

swoole同时连接 tcp http WebSocket三端数据交互

服务器代码 <?php use Swoole\WebSocket\Server; class Test { public $ws; public $redis; public function __construct() { Co::set(['enable_preemptive_scheduler' => 0])...

qq_20376949的博客 2771

从零开始用Plaxis 2D设计深基坑支护结构:含地锚与桩墙实战教程

本文提供了一份基于Plaxis 2D的深基坑支护结构设计实战教程。教程以钻孔灌注桩排桩结合预应力锚索的典型支护体系为例,详细阐述了从地质模型建立、材料参数定义(重点介绍硬化土模型)、施工阶段模拟(含开挖、锚索施加预应力和地下水渗流固结耦合分析)到结果解读与设计优化的全流程。旨在帮助岩土工程师掌握数值模拟核心,实现从经验设计到量化分析的跨越。

kotlin6android的博客 506

RWEQ土壤风蚀模型的估算与变化归因分析

本次以介绍RWEQ模型的基本原理及数据需求,再结合案例讲解RWEQ模型中区域地理空间数据库构建的方法和各个参量提取的原理与方法,最后结合典型案例进行综合讲解风蚀模数估算、制图及归因分析。空间分析与制图:提取分析、局部分析、邻域分析、区域分析、插值分析、平滑处理、像元提取、采样与重采样。以某实际应用为案例,掌握RWEQ模型进行当地土壤风蚀量空间分布分析整体流程。地图服务器、在线地图、范围指示器、格网、表格、基础地图服务使用规则介绍。掌握土壤风蚀模型的原理、优势点及因子组成。

2301_77413856的博客 1194

Swoole 使用 TCP 协议实现简单的 HTTP 服务

HTTP 协议的响应包括响应头和响应体(不是必须的),响应头中的 Content-Length 用来标记响应 Body 的长度,这其实是 HTTP 协议的分包机制。假设实际发送的 Body 长度小于 Content-Length,浏览器会一直处于等待接收数据的状态(小圈一直转)。假设实际发送的 Body 长度大于 Content-Length,多于的部分会被丢弃。 Swoole\Coroutine\run(function () { $server = new Swoole\Coroutine\

weixin_40369062的博客 600

CAN收发器选型避坑指南:TJA1051T与TJA1051T/3的硬件兼容性问题实录

本文详细解析了CAN收发器TJA1051T与TJA1051T/3的硬件兼容性问题,通过实测数据和故障案例揭示了VIO引脚的关键差异及其对系统的影响。提供从选型到验证的完整防坑方案,帮助开发者避免常见设计错误,确保CAN总线通信的稳定性。

weixin_42715608的博客 459

Swoole WebSocket初探

一、什么是WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在WebSocket Api中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 二、WebSocket的作用 主要用于客户端和服务端的双...

qq_41156103的博客 1128

从零开始:使用Python实现基于深度强化学习的柔性车间调度系统

本文详细介绍了如何使用Python和深度强化学习(DRL)构建柔性车间调度系统,特别关注图神经网络(GNN)与近端策略优化(PPO)算法的结合应用。通过实战指南,读者将学习从环境准备、异构图构建到PPO算法实现的全流程,最终实现生产效率的显著提升。

weixin_29074295的博客 244

【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系

摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。

智慧空间实验室 2403

js websocket同步等待_朋友们,html websocket是同步的吗?如何实现异步

展开全部WebSocket protocol 是HTML5一种新的协议(protocol)。它是实32313133353236313431303231363533e59b9ee7ad9431333363373232现了浏览器与服务器全双工通信(full-duplex)。现在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time i...

weixin_39849239的博客 1398

代码的自由之旅:用AI写出无版权烦恼的Verilog

他们还基于这个数据集,训练了一个名叫“FreeV”的AI模型,不仅能写出好用的Verilog代码,还把版权侵权的风险降到了仅3%。为了让AI安全地写Verilog,研究团队提出了三个“法宝”:一个检测AI是否会生成侵权代码的测试方法、一个干净的Verilog数据集FreeSet,还有一个基于FreeSet训练的AI模型FreeV。AI的记忆力超强,能记住训练时见过的代码。测试发现,一些用Verilog数据训练过的AI,比如VeriGen,生成侵权代码的概率从9%涨到了15%,说明它们可能学了不该学的代码。

步子哥的博客 1810

php socket nodejs,Nodejs实现websocket的4种方式

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网...

weixin_29942159的博客 553

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

/在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。

Welcome To My6n Blog 4333

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

php7安装mysqli扩展_Swoole入门指南:PHP7安装Swoole详细教程

这一段时间准备为大家带来swoole的入门教程,感受一下php的nodeJs强悍之处。所有的示例代码均放在了github上:learn-swoole环境这里不在使用apache做为web server。该用nginx + php-fpm,性能更强大,配置更方便。并且为了跟上php的步伐,也使用了比较新的php版本[x] centos7[x] php7.0.12[x] nginx/1.10.2[x]...

weixin_39968655的博客 146

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

PHP swoole 和 nodeJs性能分析

PHP异步框架Swoole和nodeJs性能对比:ab测试工具分析

水哥的编程日志 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Node.js网络编程之WebSocket篇

WebSocket WebSocket协议是基于 HTTP 协议之上的扩展,是一种可以双向通信的协议。其特点包括: 建立在 TCP 协议之上,服务器端的实现比较容易; 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器; 数据格式比较轻量,性能开销小,通信高效; 可以发送文本,也可以发送二进制数据; 没有同源限制,客户端可以与任意服务器通信; 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL

zxl1990_ok的博客 1万+

Node.js实现WebSocket

node.js实现WebSocket的详细介绍

上庸者-不服周 1万+

C++网络编程之WebSocket通信

WebSocket协议是现代Web开发中不可或缺的一部分,它允许客户端和服务器之间建立持久的连接,实现双向实时通信。与传统的HTTP请求不同,WebSocket提供了一种全双工的通信通道,使得数据可以在任意方向上传输,而无需等待对方请求或者应答。WebSocket是在HTML5中引入的一种新协议,旨在替代轮询等技术来实现客户端与服务器间的实时交互。它通过HTTP或HTTPS协议发起一个特殊的请求,一旦连接建立成功,就可以绕过HTTP协议直接进行数据交换。

hope_wisdom的技术博客 3573

websocket 同步发数据 、异步发数据

websoekt 异步发送信息

songmaolin_csdn的博客 1万+

PHP通过soket发送modbus指令,如何通过modbus/TCP异步读取数据并发送到web上

我不熟悉modbus或pymodbus,所以我在猜测并留下很多空白供您填写。在这是从我最近放在一起用来接收snmptrap并将信息重新分发到连接的websockets上的东西。在希望这足以让你继续:#!/usr/bin/pythonfrom twisted.internet import protocol, reactor, utils, deferfrom twisted.web.server ...

weixin_28829339的博客 1001

websocket传递参数php,如何使用WebSocket发送和接收数据

WebSocket是一种允许通过保持服务器端和用户端始终连接来进行双向通信的技术,所以WebSocket既可以发送数据也可以接收数据,本篇文章我们就来看看如何使用WebSocket发送和接收数据。我们先来看一下如何发送文本数据?使用免费提供的echo.websocket.org作为样本具体示例如下var connection = new WebSocket('wss://echo.websocke...

weixin_29877113的博客 2430

php webscokt_在PHP服务中使用Websocket

WebSocketWebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。为什么需要 WebSocket?需求是:用户停留页面 15 分钟,且没有任何操作,则弹出登陆窗口,让用户重新登陆。一般这样的需求实现多为长连接轮询,会有浏览器的...

weixin_39566914的博客 357

swoole中对websocket的理解

我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终端的情况下,都可以完美的和服务端兼容。这样就轻松实现了MVC各个部分的真正解耦。但是提高程序的友好性还是有很多路要走,其中一个大家都会遇到的就是数据实时更新的问题。比如一个用户在手机上做了添加操作,这时候其他的终端也应该及时显示数据的变化情况。这个对于手机来说还算好办,因为现在的各种推送服务完全可以满足...

一只不正经的程序猿的博客 1752

基于websocket和swoole的简易聊天室

背景: 之前做过一个微信推送自动化工具,是使用ajax循环请求,curl发送,一次发一万条,但是因为是短连接,很容易超时,经常请求发出去了,但是返回结果是超时,导致发重,后来经过领导指点,使用了websocket和swoole进行了开发,效果非常好,websocket 连接服务端,建立长连接,发送参数过去,然后服务端运行脚本,以cli形式发送,因为websocket建立的是长连接,并且,客户端和

wangsiyuan1009的专栏 6717
上一篇: 关于MySQL外连接查询的NULL
下一篇: Navicat for MySQL 远程连接
小Z笔记
博客等级 码龄9年 11粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值