客户端(JS浏览器)和服务器(PHP)通过Web套接字通过IP进行通信



我是web套接字的新手。我正在尝试通过网络套接字在客户端和服务器之间建立通信。我遵循这个链接的代码:

https://phppot.com/php/simple-php-chat-using-websocket/

这是我的尝试:

  1. 客户端JS端:

var ws=新的WebSocket("ws://myIp:8090"(;

  1. 服务器PHP端:

define('HOST_NAME',"myIP"(
define('PORT',"8090"(;

现在在浏览器中当我去的时候,

  1. 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套接字,并成功建立通信。

  1. 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套接字进行通信的方法。

  1. 如果服务器和客户端在同一台电脑中:case 1将根据上述问题进行处理
  2. 如果服务器和客户端在不同的PC中:在客户端(JS(侧,将IP地址设置为服务器PC IP即可工作

客户端JS端:

var ws=新的WebSocket("ws://Server_PC_IP:8090"(;

最新更新