安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端,实现后端有数据更新时,前端页面自动更新数据。
我使用的是基于Thinkphp5.0的ThinkCMF5.0。
安装:
1 |
<span class="token function">composer</span> require topthink/think-worker<span class="token operator">=</span>v1.0.1 |
启动:
1 |
php server.php start -d |
public目录下放置的server.php文件,注意里面的配置必须按照你的Worker控制器来:
1 |
<span class="token comment">#!/usr/bin/env php</span> <span class="token operator"><</span><span class="token operator">?</span>php <span class="token comment">// 调试模式开关</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"APP_DEBUG"</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义 APP 命名空间</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"APP_NAMESPACE"</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'api'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义CMF根目录,可更改此目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'CMF_ROOT'</span><span class="token punctuation">,</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/../'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义应用目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'APP_PATH'</span><span class="token punctuation">,</span> <span class="token constant">CMF_ROOT</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'api/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义CMF目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'CMF_PATH'</span><span class="token punctuation">,</span> <span class="token constant">CMF_ROOT</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'simplewind/cmf/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义网站入口目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'WEB_ROOT'</span><span class="token punctuation">,</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义插件目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'PLUGINS_PATH'</span><span class="token punctuation">,</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/plugins/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义扩展目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'EXTEND_PATH'</span><span class="token punctuation">,</span> <span class="token constant">CMF_ROOT</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'simplewind/extend/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'VENDOR_PATH'</span><span class="token punctuation">,</span> <span class="token constant">CMF_ROOT</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'simplewind/vendor/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 定义应用的运行时目录</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'RUNTIME_PATH'</span><span class="token punctuation">,</span><span class="token constant">__DIR__</span><span class="token operator">.</span><span class="token string single-quoted-string">'/../data/runtime/api/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//define('APP_PATH', __DIR__ . '/api/');</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'BIND_MODULE'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'user/Worker'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 加载框架引导文件</span> <span class="token keyword">require</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/../simplewind/thinkphp/start.php'</span><span class="token punctuation">;</span> |
woker控制器:
1 |
<span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">api<span class="token punctuation"></span>user<span class="token punctuation"></span>controller</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">think<span class="token punctuation"></span>Db</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">think<span class="token punctuation"></span>worker<span class="token punctuation"></span>Server</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Workerman<span class="token punctuation"></span>Worker</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Workerman<span class="token punctuation"></span>Lib<span class="token punctuation"></span>Timer</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">WorkerController</span> <span class="token keyword">extends</span> <span class="token class-name">Server</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">protected</span> <span class="token variable">$socket</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'websocket://0.0.0.0:2346'</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$uidConnections</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$HEARTBEAT_TIME</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'60'</span><span class="token punctuation">;</span> <span class="token comment">/** * 收到信息 * @param $connection * @param $data */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onMessage</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token punctuation">,</span> <span class="token variable">$datas</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">lastMessageTime</span> <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token variable">$datas</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token operator">-></span><span class="token property">uid</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$uid</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//这里的uid根据自己的情况去验证</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$uid</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$data</span><span class="token operator">-></span><span class="token property">type</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'login'</span><span class="token punctuation">:</span> <span class="token comment">// 保存该用户的输送数据</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uidConnections</span><span class="token punctuation">[</span><span class="token variable">$uid</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$connection</span><span class="token punctuation">;</span> <span class="token comment">// $connection->send('发送成功');</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'send'</span><span class="token punctuation">:</span> <span class="token comment">// 发送消息</span> <span class="token comment">// $this->sendMessageByUid($uid, $datas);</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">/** * 当连接建立时触发的回调函数 * @param $connection */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onConnect</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'链接成功'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 当连接断开时触发的回调函数 * @param $connection */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onClose</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">uid</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">// 连接断开时删除映射</span> <span class="token keyword">unset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uidConnections</span><span class="token punctuation">[</span><span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">uid</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">/** * 当客户端的连接上发生错误时触发 * @param $connection * @param $code * @param $msg */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onError</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token punctuation">,</span> <span class="token variable">$code</span><span class="token punctuation">,</span> <span class="token variable">$msg</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"error <span class="token interpolation"><span class="token variable">$code</span></span> <span class="token interpolation"><span class="token variable">$msg</span></span>n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 每个进程启动 * @param $worker */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">onWorkerStart</span><span class="token punctuation">(</span><span class="token variable">$worker</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符</span> <span class="token variable">$inner_text_worker</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Worker</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'text://0.0.0.0:2347'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// $inner_text_worker->reusePort=true;</span> <span class="token variable">$inner_text_worker</span><span class="token operator">-></span><span class="token property">onMessage</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">// $data数组格式,里面有uid,表示向那个uid的页面推送数据</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token variable">$buffer</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$uid</span> <span class="token operator">=</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'uid'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 通过workerman,向uid的页面推送数据</span> <span class="token variable">$ret</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">sendMessageByUid</span><span class="token punctuation">(</span><span class="token variable">$uid</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 返回推送结果</span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$ret</span> <span class="token operator">?</span> <span class="token string single-quoted-string">'ok'</span> <span class="token punctuation">:</span> <span class="token string single-quoted-string">'fail'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// ## 执行监听 ##</span> <span class="token variable">$inner_text_worker</span><span class="token operator">-></span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name static-context">Timer</span><span class="token operator">::</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">use</span><span class="token punctuation">(</span><span class="token variable">$worker</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token variable">$time_now</span> <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$worker</span><span class="token operator">-></span><span class="token property">connections</span> <span class="token keyword">as</span> <span class="token variable">$connection</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">lastMessageTime</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">lastMessageTime</span> <span class="token operator">=</span> <span class="token variable">$time_now</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// $diff_time = $time_now - $connection->lastMessageTime;</span> <span class="token comment">// $msg = '距离上次通话已经过去'.$diff_time.'秒';</span> <span class="token comment">// $connection->send($msg);</span> <span class="token comment">// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$time_now</span> <span class="token operator">-</span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token property">lastMessageTime</span> <span class="token operator">></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">HEARTBEAT_TIME</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 向所有验证的用户推送数据</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">broadcast</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uidConnections</span> <span class="token keyword">as</span> <span class="token variable">$connection</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 针对uid推送数据</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sendMessageByUid</span><span class="token punctuation">(</span><span class="token variable">$uid</span><span class="token punctuation">,</span> <span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uidConnections</span><span class="token punctuation">[</span><span class="token variable">$uid</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token variable">$connection</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">uidConnections</span><span class="token punctuation">[</span><span class="token variable">$uid</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$connection</span><span class="token operator">-></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
后端主动推送到前端:
1 |
<span class="token variable">$client</span> <span class="token operator">=</span> <span class="token function">stream_socket_client</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'tcp://127.0.0.1:2347'</span><span class="token punctuation">,</span> <span class="token variable">$errno</span><span class="token punctuation">,</span> <span class="token variable">$errmsg</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 推送的数据,包含uid字段,表示是给这个uid推送</span> <span class="token variable">$data_sock</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'uid'</span><span class="token operator">=></span><span class="token variable">$merchant</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'type'</span><span class="token operator">=></span><span class="token string single-quoted-string">'update'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 发送数据,Text协议需要在数据末尾加上换行符</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$client</span><span class="token punctuation">,</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$data_sock</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 读取推送结果</span> <span class="token comment">// echo fread($client, 8192);</span> |
前端代码:
1 |
<span class="token function">socketStart</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">var</span> uid <span class="token operator">=</span> localStorage<span class="token punctuation">.</span><span class="token function">getItem</span><span class="token punctuation">(</span><span class="token string">'token'</span><span class="token punctuation">)</span> <span class="token keyword">var</span> socket <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WebSocket</span><span class="token punctuation">(</span><span class="token string">'wss://www.yechai.com/wss'</span><span class="token punctuation">)</span> <span class="token comment">// 打开Socket</span> socket<span class="token punctuation">.</span><span class="token function-variable function">onopen</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{<!-- --></span> socket<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{<!-- --></span> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'login'</span><span class="token punctuation">,</span> <span class="token literal-property property">uid</span><span class="token operator">:</span> uid<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> socket<span class="token punctuation">.</span><span class="token function-variable function">onmessage</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>data<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'update'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">fetchData</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//收到更新命令,前端更新</span> <span class="token comment">// console.log('receive', event.data)</span> <span class="token punctuation">}</span> <span class="token comment">// 监听Socket的关闭</span> socket<span class="token punctuation">.</span><span class="token function-variable function">onclose</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{<!-- --></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'close'</span><span class="token punctuation">,</span> event<span class="token punctuation">)</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">socketStart</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">50000</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> socket<span class="token punctuation">.</span><span class="token function-variable function">onerror</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">this</span><span class="token punctuation">.</span>socket <span class="token operator">=</span> socket <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">socketSend</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">var</span> uid <span class="token operator">=</span> localStorage<span class="token punctuation">.</span><span class="token function">getItem</span><span class="token punctuation">(</span><span class="token string">'token'</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span>socket<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{<!-- --></span> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'send'</span><span class="token punctuation">,</span> <span class="token literal-property property">uid</span><span class="token operator">:</span> uid<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> |
Nginx配置:
1 |
location /wss <span class="token punctuation">{<!-- --></span> proxy_pass http://1.1.1.1:2346<span class="token punctuation">;</span> proxy_http_version <span class="token number">1.1</span><span class="token punctuation">;</span> proxy_set_header Upgrade <span class="token variable">$http_upgrade</span><span class="token punctuation">;</span> proxy_set_header Connection <span class="token string">"upgrade"</span><span class="token punctuation">;</span> proxy_read_timeout 180s<span class="token punctuation">;</span> proxy_set_header Host <span class="token variable">$host</span><span class="token punctuation">;</span> proxy_set_header X-Real-IP <span class="token variable">$remote_addr</span><span class="token punctuation">;</span> proxy_set_header REMOTE-HOST <span class="token variable">$remote_addr</span><span class="token punctuation">;</span> proxy_set_header X-Forwarded-For <span class="token variable">$proxy_add_x_forwarded_for</span><span class="token punctuation">;</span> client_max_body_size 5000M<span class="token punctuation">;</span> <span class="token punctuation">}</span> |
因为主动推送的关系,进程数设置为1:
vendortopthinkthink-workersrcServer.php
1 |
protected <span class="token variable">$processes</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> |
为什么?
例如:客户端1连接进程A,客户端2连接进程B,客户端2无法直接通过进程B给客户端1发送数据,因为客户端1属于进程A不属于进程B,B进程控制不到客户端1(要想两个进程之间通讯需要一些进程间通讯手段,可以使用http://doc3.workerman.net/component/channel.html)。所以所有客户端都只能连接同一个进程才能直接互相通讯,为了避免客户端连到不同进程,count设置为1。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。