当前位置: 首页 > 知识库问答 >
问题:

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

阎单鹗
2023-03-14

我不熟悉web套接字。我试图通过web套接字在客户端和服务器之间建立通信。我遵循此链接中的代码:

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

以下是我的尝试:

  1. 客户端:

var ws=newwebsocket(“ws://myIp:8090”);

定义('HOST_NAME',"myIP");
定义('PORT',"8090");

现在在浏览器中,当我选择,

  1. http://localhost:8090:浏览器中的初始握手请求标题:

接受编码:gzip,deflate接受语言:en-US,en;q=0.9缓存控制:无缓存连接:升级主机:myIP:8090来源:http://localhost:8090 Pragma:no-cache-Sec-WebSocket扩展:permessage-deflate;客户端\u最大\u窗口\u位秒WebSocket密钥:tj0fwdcefjcumtrcnojuq==秒WebSocket版本:13升级:WebSocket用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/87.0.4280.66 Safari/537.36

PHP Server中的响应报头是:

HTTP/1.1 101 Web套接字协议握手升级:websocket连接:升级websocket来源:myIP websocket位置:ws://myIP:8090/demo/shout.php秒websocket接受:DqaK Z jqf1lJ0vj5bIxFi7 EPc=

如上所述,请求和响应头都将其协议升级到web套接字并成功建立通信。

请求标题位于浏览器中:

临时标题显示为接受编码:gzip,deflate接受语言:en-US,en;q=0.9缓存控制:无缓存连接:升级主机:myIP:8090来源:http://myIP:8090 Pragma:no-cache-Sec-WebSocket扩展:permessage-deflate;客户端\u最大\u窗口\u比特秒WebSocket密钥:D73LNcTLB8P6dzPilGipQQ==秒WebSocket版本:13升级:WebSocket用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似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,类似Gecko)Chrome/87.0.4280.66 Safari/537.36接受:text/html、application/xhtml、application/xml;q=0.9,图像/avif,图像/webp,图像/apng,/;q=0.8,申请/签名交换;v=b3;q=0.9接受编码:gzip,deflate接受语言:en-US,en;q=0.9,如果不匹配:W/“41e-5E6JPMK0FNW DjhkfcoeaiAhE4”

如上所述,PHP服务器不接收浏览器发送的Web套接字升级标头。因此,服务器不会在请求头中接收任何Sec-WebSocket-Key,并得到以下错误:

ErrorException:未定义索引:Sec WebSocket键

在创建响应头时。我不知道如何解决这个问题?如何修改请求头?我在设置中是否做错了什么?这种设置能在两台不同的PC上建立通信吗?请帮忙。提前谢谢!

共有1个答案

艾才良
2023-03-14

经过一番尝试,我发现了在同一台或不同的PC机上通过Web套接字进行通信的方法。

  1. 如果服务器和客户端在同一台电脑中:将从上面的问题中得到case 1
  2. 如果服务器和客户端在不同的PC中:在客户端(JS)侧设置IP地址到服务器PC的IP将工作。

客户端JS端:

var ws=new WebSocket("ws://Server_PC_IP: 8090");

 类似资料:
  • 我对套接字有点陌生,我正在尝试编写一个程序,在这个程序中,我基本上可以从客户端程序向服务器程序发送一些简单的请求。现在我只想在客户端有1或2个选项供用户选择。例如,如果用户在客户端选择“选项1”,那么服务器会返回一条消息“您选择选项1”,以此类推,但我不知道如何读取服务器上从客户端发送的输入。 客户代码: 服务器代码: 我需要在Clinet中使用两个不同的BufferedReader吗?一个用于用

  • 目前,我支持具有以下体系结构的客户机,用于工业制造过程: 我已经在PC上设置了一个WAMP服务器和一个示例网页,我可以在PC上的任何浏览器上看到它作为“本地主机”。我知道如何通过WebView类向Android应用程序添加web浏览器视图。 但是我不知道如何让手机上的浏览器通过TCP连接看到PC上的WAMP服务器。我怎么把这两件事联系起来?

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我正在尝试连接一个带有gui的客户端和一个没有gui的服务器。连接正在进行中,但我看不到这两个应用程序之间的任何消息。(我应该将服务器放在客户端中,而将客户端放在服务器中) 客户端连接代码: PS:我也在服务器中尝试了PrintWriter,也尝试了try catch in stream语句,问题仍然存在。

  • 问题内容: 我有一个C ++服务器和两个客户端(红宝石和Java)。一切都在64位linux机器(java 1.7.0_17)上运行。ruby客户端可以正常工作,但是java版本会出现问题。 在Java中,我尝试将字符串从客户端发送到服务器。实际上,服务器收到了整个字符串,但是服务器认为还有更多东西要接收。 红宝石客户端看起来像这样: 这里的一切工作正常。红宝石客户端发送一个字符串。服务器接收该字

  • 我有这个代码可以在eclipse中与android Studio中的客户端通信服务器,我使用套接字,客户端向服务器发送消息,服务器读取该消息并确定一切正常,但当服务器向客户端发送消息时,客户端不强制任何东西;这是代码 还有这个 此代码是服务器代码的一部分,如果您需要客户端代码(Android Studio),请告诉我。 我需要帮助拜托