客户端(JS-Browser)和服务器(PHP)通过 Web-Socket 通过 IP 进行通信
Posted
技术标签:
【中文标题】客户端(JS-Browser)和服务器(PHP)通过 Web-Socket 通过 IP 进行通信【英文标题】:Client(JS-Browser) and Server(PHP) communication over IP through Web-Socket 【发布时间】:2021-03-04 11:27:56 【问题描述】:我是网络套接字的新手。我正在尝试通过 web-socket 建立客户端和服务器之间的通信。我遵循此链接中的代码:
https://phppot.com/php/simple-php-chat-using-websocket/
这是我的尝试:
-
客户端JS端:
var ws = new WebSocket("ws://myIp:8090");
-
服务器 PHP 端:
define('HOST_NAME',"myIP"); 定义('PORT',"8090");
当我去的时候,现在在浏览器中,
http://localhost:8090
:浏览器中的初始握手请求标头:
接受编码:gzip、deflate 接受语言:en-US,en;q=0.9 缓存控制:无缓存 连接:升级 主机:我的IP:8090 来源:http://localhost:8090 Pragma:无缓存 Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits Sec-WebSocket-Key:tJ0fWdCEfJCUcmtRCNOJuQ== Sec-WebSocket-版本:13 升级:websocket 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/87.0.4280.66 Safari/537.36
PHP 服务器中的响应头是:
HTTP/1.1 101 Web Socket 协议握手 升级:websocket 连接:升级 WebSocket-来源:myIP WebSocket-位置:ws://myIP:8090/demo/shout.php Sec-WebSocket-Accept:DqaK+Z+jqf1lJ0vj5bIxFi7+EPc=
如上所述,请求和响应标头都将它们的协议升级为 web-socket 并成功建立通信。
http://myIP:8090
:
请求标头在浏览器中:
显示临时标题 接受编码:gzip,放气 接受语言:en-US,en;q=0.9 缓存控制:无缓存 连接:升级 主机:我的IP:8090 来源:http://myIP:8090 Pragma:无缓存 Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits Sec-WebSocket-Key:D73LNcTLB8P6dzPilGipQQ== Sec-WebSocket-版本:13 升级:websocket 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
但是 PHP 服务器收到的请求标头是:
GET / HTTP/1.1 主机:本地主机:8090 连接:保持活动 升级不安全请求:1 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange ;v=b3;q=0.9 接受编码:gzip,放气 接受语言:en-US,en;q=0.9 If-None-Match: W/"41e-5e6jpMk0FNkw+DjhkfcoeaiAhE4"
如上所示,PHP 服务器没有收到浏览器发送的 web-socket 升级标头。所以服务器在请求头中没有收到任何Sec-WebSocket-Key
并得到这个错误:
ErrorException: Undefined index: Sec-WebSocket-Key
在创建响应标头时。我不知道如何解决这个问题?请求标头如何被修改?我在设置中做错了吗?这种设置能否在两台不同的 PC 上建立通信?请帮忙。提前致谢!
【问题讨论】:
【参考方案1】:经过多次尝试,我找到了在同一台或不同 PC 上通过 Web 套接字进行通信的方法。
-
如果服务器和客户端在同一台 PC 上:
case 1
将由上述问题解决。
如果服务器和客户端在不同的 PC 中:在 Client(JS) 端将 IP 地址设置为服务器 PC IP 将起作用。
客户端JS端:
var ws = new WebSocket("ws://Server_PC_IP:8090");
【讨论】:
以上是关于客户端(JS-Browser)和服务器(PHP)通过 Web-Socket 通过 IP 进行通信的主要内容,如果未能解决你的问题,请参考以下文章