我是web套接字的新手。我正在尝试通过网络套接字在客户端和服务器之间建立通信。我遵循这个链接的代码:
https://phppot.com/php/simple-php-chat-using-websocket/
这是我的尝试:
- 客户端JS端:
var ws=新的WebSocket("ws://myIp:8090"(;
- 服务器PHP端:
define('HOST_NAME',"myIP"(
define('PORT',"8090"(;
现在在浏览器中当我去的时候,
http://localhost:8090
:浏览器中的初始握手请求头:
接受编码:gzip,deflate接受语言:en-US,en;q=0.9缓存控制:无缓存连接:升级主机:myIP:8090原产地:http://localhost:8090Pragma:没有缓存Sec-WebSocket扩展:permesage deflate;客户端_max_window_bitsSec WebSocket密钥:tJ0fWdCEfJCUcmtRCNOJuQ==Sec WebSocket版本:13升级:websocket用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/87.04280.66 Safari/537.36
PHP服务器中的响应头是:
HTTP/1.1 101 Web套接字协议握手升级:websocket连接:升级WebSocket来源:myIPWebSocket位置:ws://myIP:8090/demo/shout.phpSec WebSocket接受:DqaK+Z+jqf1lJ0vj5bIxFi7+EPc=
如上所述,请求和响应标头都将其协议升级到web套接字,并成功建立通信。
http://myIP:8090
:
请求标头在浏览器中:
显示临时标题接受编码:gzip,deflate接受语言:en-US,en;q=0.9缓存控制:无缓存连接:升级主机:myIP:8090原产地:http://myIP:8090Pragma:没有缓存Sec-WebSocket扩展:permesage deflate;客户端_max_window_bitsSec WebSocket密钥:D73LNcTLB8P6dzPilGipQQ==Sec WebSocket版本:13升级:websocket用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/87.04280.66 Safari/537.36
但是PHP服务器接收到的请求头是:
GET/HTTP/1.1主机:localhost:8090连接:保持活动升级不安全请求:1用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/87.04280.66 Safari/537.36接受:text/html,application/xhtml+xml,application/xml;q=0.9,图像/aif,图像/web,图像/apng,/;q=0.8,申请/签署的交换;v=b3;q=0.9接受编码:gzip,deflate接受语言:en-US,en;q=0.9如果不匹配:W/";41e-5e6jpMk0FNkw+DjhkfcoeaiAhE4";
如上所述,PHP服务器不会收到浏览器发送的web套接字升级标头。因此,服务器在请求标头中没有接收到任何Sec-WebSocket-Key
,并得到以下错误:
ErrorException: Undefined index: Sec-WebSocket-Key
同时创建响应标头。我不知道该怎么解决?如何修改请求标头?我在设置中做错了什么吗?这种设置能在两台不同的电脑上建立通信吗?请帮忙。提前感谢!
经过一番尝试,我找到了在同一台或不同电脑中通过Web套接字进行通信的方法。
- 如果服务器和客户端在同一台电脑中:
case 1
将根据上述问题进行处理 - 如果服务器和客户端在不同的PC中:在客户端(JS(侧,将IP地址设置为服务器PC IP即可工作
客户端JS端:
var ws=新的WebSocket("ws://Server_PC_IP:8090"(;