workman 搭建tcp服务器,和websocket互相通信
前一段时间需要做一个小demo,把温湿度传感器采集到的数据同步显示在浏览器网页上。抽了点时间把demo做了出来,虽然是个小demo,功能也比较简单,但是做的时候还是踩了一些坑,记录一下流程。
参考链接:https://www.cnblogs.com/zjfree/p/6491740.html
1. 下载安装workman
workman:官网地址
workman开发文档:官网文档地址
根据文档所说:
WorkerMan实际上就是一个PHP代码包,如果你的PHP环境已经装好,只需要把WorkerMan源代码或者demo下载下来即可运行。
这里我选择用composer安装
composer require workerman/workerman
2. 代码实现
<?php
use Workerman\Worker;require_once __DIR__ . '\Workman\Autoloader.php';// 设置时区
date_default_timezone_set("PRC");// websocket 协议的worker
$ws_worker = new Worker('Websocket://0.0.0.0:5678');
// 这里只能写1
$ws_worker->count = 1;
// websocket server 启动后在当前进程增加一个socket监听
$ws_worker->onWorkerStart = function($ws_worker)
{// 增加一个Socket端口的监听设备发来的数据$socket_worker = new Worker('tcp://0.0.0.0:1236');// 当设备发来数据时如何处理$socket_worker->onMessage = function($connection, $data){// 这里处理设备发来的数据 $data// 比如像这样给所有的WebSocket连接转发数据global $ws_worker;if ($data === FALSE) return;foreach($ws_worker->connections as $ws_con){$data = json_encode(['code'=>666,'data'=>$data]);$ws_con->send($data);}};// 给ws_worker添加一个属性保存socket_worker,方便获取// 之前ws接收的数据一直推送不到tcp,问题就在这里,这里要保存一下$ws_worker->socketWorker = $socket_worker;// 执行监听$socket_worker->listen();
};// websocket协议也就是浏览器发来数据时
$ws_worker->onMessage = function($connection, $data)
{// 假设需要转发给所有的设备global $ws_worker;foreach($ws_worker->socketWorker->connections as $socket_con){// 处理业务代码}
};Worker::runAll();
其中遇到的问题就是,websocket端接收到的数据无法发送到tcp,直到看到
$ws_worker->socketWorker = $socket_worker;
把socket_worker保存在ws_worker里,再ws推送信息时,循环数组,达到推送所有设备的目的。
3. 前端代码实现
<script>var wsObj = new WebSocket("ws://ip:port"); //建立连接wsObj.onopen = function(){ var ms = {code:200,msg:"success"};wsObj.send(JSON.stringify(ms));};wsObj.onmessage = function(ev){ //获取后端响应var msg=eval("("+ev.data+")");// 格式化json数据if (msg['code'] == 666) {var data = msg['data']var res = eval("("+ data +")")// 处理数据}};wsObj.onclose = function(ev){// 断开连接alert("close");};wsObj.onerror = function(ev){// 连接出错alert("error");};
</script>
具体的业务代码就不上了。
4. 小结
wokerman还是比较好用的,这个demo没有选择使用原生socket服务,也是为了节约时间和成本,快速实现开发目的。
workman 搭建tcp服务器,和websocket互相通信相关推荐
- 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信
基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...
- 在Linux上搭建TCP通信测试服务器
在Linux上搭建TCP通信测试服务器 前言 在 Linux平台上搭建TCP通信测试服务器的方法多种多样,本文就列举出来非常简单的服务器搭建方法. 搭建TCP通信测试服务器的主要作用就是为了验证TCP ...
- 在阿里云ECS上搭建Skynet服务器与Unity通信
在阿里云ECS上搭建Skynet服务器与Unity通信 创建阿里云ECS实例 Skynet搭建 服务端代码部分 客户端部分(Unity) 创建阿里云ECS实例 这部分的话按照阿里云流程去做就可以了.也 ...
- 简易TCP服务器搭建
目录 一.套接字及其分类 二.相关接口函数 三.TCP服务器搭建流程 1.创建套接字socket() 2.保存服务器信息 3.套接字绑定 4.监听客户端连接请求 5.接收客户端连接请求 6.数据收发 ...
- linux tcp 服务器 c,Linux网络编程篇之Tcp协议介绍, C/S通信及聊天室实现
基于tcp协议的网络程序流程图如下: tcp协议网络程序流程图 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态 客户端调用so ...
- 【TCP网络编程】C语言实现TCP服务器和客户端之间的通信(linux)
功能描述 利用TCP网络通信实现客户端和服务器的通信 服务器代码 server.c #include<stdio.h> #include<sys/socket.h> #incl ...
- QT网络编程——TCP服务器和客户端通信
目录 一.服务器端 1.QT中TCP服务器的开发思路 2.QT服务器界面设计 3.QT服务器代码实现 二.客户端 1.QT中TCP客户端的开发思路 2.QT客户端界面设计 3.QT客户端代码实现 网络 ...
- libevent实现TCP服务器通信
libevent实现TCP服务器通信 1.libevent库安装 1.1 libevent库优点 1.2源码包安装步骤 2.libevent框架 2.1创建事件 2.2添加事件到 event_base ...
- 使用EMQX搭建MQTT服务器,实现设备的通信(1)
一.前言 最近我们选择智能家居方面的比赛.课设,为了保存学习记录,所以用文章来记录一下我们从软件到硬件的整个实现的过程,同时希望能帮助也想要实现相关功能的小伙伴. 二.MQTT介绍 (可跳过) MQT ...
- TCP/IP,单进程服务器与客户端连接通信,ipv4,TCP传输,无复用简单实例,nc模拟客户端连接服务器
TCP/IP,单进程服务器与客户端连接通信,ipv4,TCP传输,无复用简单实例 一.实例设定 1.服务器与客户端均是本机,服务器绑定的ip可以是宏INADDR_ANY,这个宏表示可以和本机的所有网卡 ...
最新文章
- pandas使用itertuples函数迭代dataframe中的数据行并自定义修改行中的数值(update row while iterating over the rows)
- 在Windows应用程序中使用正则表达式
- 高级C语言教程-C语言函数setjmp()函数
- python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary
- 关于WinCE6.0补丁包的一点说明
- STM8L051F3_0d_基础介绍
- 计算机网络第七版谢希仁习题,计算机网络 释疑与习题解答 谢希仁 第7七版 计算机网络(第7版)谢...
- Boost电路调试心得
- 3-19JavaScript
- bat一键清理系统垃圾/系统日志
- 简单说下antv图表的使用
- 【vs】 试图加载格式不正确的程序
- 盘点各大互联网公司2017中秋月饼设计,你最喜欢哪一个?
- 一键修复手机电池_怎么恢复手机电池寿命(教你一键修复电池损耗)
- 【Nginx】configure 报错checking for C compiler … not found
- 出现报错No such file or directory: experiments/coco/w32/w32_4x_reg03_bs10_512_adam_lr1e-3_coco_x140.yaml
- Matlab公网通信的实现(NAT123实现内网穿透)
- 合法与不合法的标识符
- GVM踩坑记录之:rsync: connection unexpectedly closed 和 rsync: read error: Connection reset by peer (104)
- android爬取视频播放地址,Android 视频中抓取图像 - MediaMetadataRetriever