<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[workerman怎么配置wss]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Fri, 29 May 2020 09:54:03 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	Workerman如何创建一个wss服务，使得客户端可以用过wss协来连接通讯，比如在微信小程序中连接服务端。<br/><br/>答：<br/><br/>wss协议实际是websocket+SSL，就是在websocket协议上加入SSL层，类似https(http+SSL)。<br/><br/>所以只需要在websocket协议的基础上开启SSL即可支持wss协议。 <br/><br/>直接用Workerman开启SSL<br/><br/>准备工作：<br/><br/>1、Workerman版本不小于3.3.7<br/><br/>2、PHP安装了openssl扩展<br/><br/>3、已经申请了证书（pem/crt文件及key文件）放在磁盘任意目录<br/><br/>代码：<br/><br/><div class="code"><br/>&lt;?php<br/><br/>require_once __DIR__ . &#039;/Workerman/Autoloader.php&#039;;<br/><br/>use Workerman&#92;Worker;<br/><br/> <br/><br/>// 证书最好是申请的证书<br/><br/>$context = array(<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;ssl&#039; =&gt; array(<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 请使用绝对路径<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;local_cert&#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; &#039;磁盘路径/server.pem&#039;, // 也可以是crt文件<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;local_pk&#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; &#039;磁盘路径/server.key&#039;,<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;verify_peer&#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; false,<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// &#039;allow_self_signed&#039; =&gt; true, //如果是自签名证书需要开启此选项<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>);<br/><br/>// 这里设置的是websocket协议（端口任意，但是需要保证没被其它程序占用）<br/><br/>$worker = new Worker(&#039;websocket://0.0.0.0:443&#039;, $context);<br/><br/>// 设置transport开启ssl，websocket+ssl即wss<br/><br/>$worker-&gt;transport = &#039;ssl&#039;;<br/><br/>$worker-&gt;onMessage = function($con, $msg) &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;$con-&gt;send(&#039;ok&#039;);<br/><br/>&#125;;<br/><br/> <br/><br/>Worker::runAll();<br/>?&gt;<br/></div><br/><br/>通过以上的代码，Workerman就监听了wss协议，客户端就可以通过wss协议来连接workerman实现安全即时通讯了。<br/><br/>测试<br/><br/>打开chrome浏览器，按F12打开调试控制台，在Console一栏输入(或者把下面代码放入到html页面用js运行)<br/><br/><div class="code"><br/>// 证书是会检查域名的，请使用域名连接<br/><br/>ws = new WebSocket(&quot;wss://域名&quot;);<br/><br/>ws.onopen = function() &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;连接成功&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ws.send(&#039;tom&#039;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;给服务端发送一个字符串：tom&quot;);<br/><br/>&#125;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ws.onmessage = function(e) &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;收到服务端的消息：&quot; + e.data);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;<br/></div><br/><br/>注意：<br/><br/>1、如果无法启动，则一般是443端口被占用，请改成其它端口，注意改成其它端口后客户端连接时需要带上端口号，客户端连接时地址类似wss://domain.com:xxx ，xxx为端口号。如果必须使用443端口请使用方法二代理的方式实现wss。<br/><br/>2、wss端口只能通过wss协议访问，ws无法访问wss端口。<br/><br/>3、证书一般是与域名绑定的，所以测试的时候客户端请使用域名连接，不要使用ip去连。<br/><br/>4、如果出现无法访问的情况，请检查服务器防火墙。<br/><br/>5、此方法要求PHP版本>=5.6，因为微信小程序要求tls1.2，而PHP5.6以下版本不支持tls1.2。
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] workerman怎么配置wss]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>