javascript - 客户端(JS-Browser)和服务器(PHP)通过 Web-Socket 通过 IP 进行通信
问题描述
我是网络套接字的新手。我正在尝试通过 web-socket 建立客户端和服务器之间的通信。我遵循此链接中的代码:
https://phppot.com/php/simple-php-chat-using-websocket/
这是我的尝试:
- 客户端JS端:
var ws = new WebSocket("ws://myIp:8090");
- 服务器PHP端:
定义('HOST_NAME',“我的IP”);
定义('端口',“8090”);
现在在浏览器中,当我去的时候,
http://localhost:8090
:浏览器中的初始握手请求标头:
Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Cache-Control: no-cache Connection: Upgrade Host: myIP:8090 Origin: http://localhost:8090 Pragma: no-cache Sec -WebSocket-Extensions:permessage-deflate;client_max_window_bits Sec-WebSocket-Key: tJ0fWdCEfJCUcmtRCNOJuQ== Sec-WebSocket-Version: 13 升级: websocket User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66野生动物园/537.36
PHP 服务器中的响应标头是:
HTTP/1.1 101 Web Socket 协议握手升级:websocket 连接:升级 WebSocket-Origin:myIP WebSocket-Location:ws://myIP:8090/demo/shout.php Sec-WebSocket-Accept:DqaK+Z+jqf1lJ0vj5bIxFi7+EPc=
如上所述,请求和响应标头都将它们的协议升级为 web-socket 并成功建立通信。
http://myIP:8090
:
请求标头在浏览器中:
显示临时标题 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Cache-Control: no-cache Connection: Upgrade Host: myIP:8090 Origin: http://myIP:8090 Pragma:无缓存 Sec-WebSocket-Extensions:permessage-deflate;client_max_window_bits Sec-WebSocket-Key: D73LNcTLB8P6dzPilGipQQ== Sec-WebSocket-Version: 13 升级: websocket 用户代理: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66野生动物园/537.36
但 PHP 服务器收到的请求标头是:
GET / HTTP/1.1 主机:localhost:8090 连接:keep-alive Upgrade-Insecure-Requests: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 Accept-Encoding: gzip, deflate Accept-Language: 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 上建立通信?请帮忙。提前致谢!
解决方案
经过这里和那里的一些尝试,我找到了通过相同或不同 PC 中的 Web 套接字进行通信的方法。
- 如果服务器和客户端在同一台 PC 中:
case 1
将从上述问题中解决。 - 如果服务器和客户端在不同的 PC 中:在客户端(JS)端将 IP 地址设置为服务器 PC IP 将起作用。
客户端JS端:
var ws = new WebSocket("ws://Server_PC_IP:8090");
推荐阅读
- arrays - 带三元运算符的 int 布尔值
- utm - proj4.js 如何将 UTM 转换为 EOV 坐标?
- java - 什么是模块信息以及如何使用它?它会影响引用的库吗?
- c# - 为什么我会收到编译器错误 CS0117 -“类名”不包含“方法名”的定义
- endpoint - 无服务器从 Api 处理程序获取所有现有端点的列表
- javascript - 如何在 node.js 中的未来特定时间触发函数?
- javascript - 什么为什么!?棘手的 JS 代码传播...和 [].concat
- python - cffi:如何将字符串的字符地址发送到 C 函数?
- loops - 如何在循环内累积承诺返回
- vue.js - graphql-tag/loader:模块构建失败并出现 GraphQLError:语法错误