socket.io - 关于php websocket的几点疑问?

查看:119
本文介绍了socket.io - 关于php websocket的几点疑问?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

  1. websocket运行的时候必须是在CLI模式下吗?也就是必须要打开cmd命令窗口吗?如果是必须要打开cmd的话,会不会很麻烦?

  2. 简单的聊天室系统是让用户访问同一个网站的同个端口,如果我两个页面或者多个页面进行数据操作该如何操作?

  3. websoket的时候,js如何向服务端发送数据保证页面不跳转?现在好像只能通过点击url的方式把数据发送给服务端,ajax好像是不行

  4. 有没有不通过cmd窗就可以使用socket的方法?

针对第二个问题,多个页面进行交互采用socket方式的时候,我是运行了两个cmd命令窗端口端口也不一样),同时集成一个socket服务,然后在网页上通过IP+端口的方式进行访问。然后当页面1发送数据到服务端的时候,再通过服务端推送到页面2或者更多...但是我总觉得这样处理有点不妥,很愚钝,有没有更好的处理办法?

对了,简单贴下代码:

因为是两个页面,所以开启了两个端口和两个目录,两个html页面引用的io端口号也一样。

跪求大神帮我解惑啊!!!

-----分割线-----
鉴于高票的回答和我的疑问,补充几点:
第一个是关于打开两个页面的问题,我两个页面不一样,里面的js自然也是不一样,怎么个不一样法,我贴代码(这里只提供了注册标记的代码):

页面A:

页面B:

但是我要连接总得访问url吧?访问url才能运行js代码,这样才能注册(就是两个页面去连解io服务)。是不是这么个道理?所以这里是有些疑问的

第二个 就是我发现我运行cmd,打开socket项目的时候必须通过ip+port(127.0.0.1:2123)的方式去访问,是所有sokect的所有项目都是这样访问的还是我自己理解有误?如果我理解有误的话,那么第一个问题就解决了,我可以使用127.0.0.1:2123的方式去访问页面A,然后用127.0.0.1:2123/B的方式去访问页面B,而无需注册两个端口,开127.0.0.1:2123区访问页面A,开127.0.0.1:2124的方式去访问页面B了

以上两点。

解决方案

这是一个好问题,是一个真正试图学习websocket的程序员提出的独立思考过的问题。尽管问题中有一些信息不全,但是它是应该得到一个认真的回答、友善的纠正,而不是嘲讽。


下面开始答题

1.websocket运行的时候必须是在CLI模式下吗?也就是必须要打开cmd命令窗口吗?如果是必须要打开cmd的话,会不会很麻烦?

是的,传统php页面访问,是访问一次运行一次,运行结束就结束php进程。但是websocket是常驻内存的进程,必须由命令行启动。调试、开发时,我们一般都是使用一个CMD窗口来运行它,这并不会麻烦,而且我们修改了代码,需要重新启动一下,不然代码不会生效。线上环境时,我们可以将它写成一个service脚本来开机启动。或者使用supervisor这种进程管理软件来启动它。

2.简单的聊天室系统是让用户访问同一个网站的同个端口,如果我两个页面或者多个页面进行数据操作该如何操作?

针对第二个问题,多个页面进行交互采用socket方式的时候,我是运行了两个cmd命令窗和端口(端口也不一样),同时集成一个socket服务,然后在网页上通过IP+端口的方式进行访问。然后当页面1发送数据到服务端的时候,再通过服务端推送到页面2或者更多...但是我总觉得这样处理有点不妥,很愚钝,有没有更好的处理办法?

其实你这个问题可以理解成,如何从一个端口提供一个聊天室变成一个端口提供多个聊天室。我们可以用聊天室id来区分,也可以用聊天室url来区分。都只是一个聊天室标记而已。

为了实现这一点,我们需要为每个连接到服务端的用户记录一个此用户所属聊天室的标记,每次收到的用户消息,我们也要求他得有一个要发送到的聊天室标记,然后我们在服务端群发用户消息时,就不是直接无脑发给所有用户了。而是在循环时判断一下,如果此用户所属聊天室=要发送到的聊天室 则发送,否则略过这个用户。至此即实现了多聊天室应用。

3.websoket的时候,js如何向服务端发送数据保证页面不跳转?现在好像只能通过点击url的方式把数据发送给服务端,ajax好像是不行

如果这个是发送消息的代码的话,那改成ajax是可行的。至于为什么你说ajax不行,还请给出不行的症状。光说你病了,但是不告诉医生你的症状,是没法诊断的。

4.有没有不通过cmd窗就可以使用socket的方法?

linux参考第一条的supervisor。windows可以参考bat脚本(定时+隐藏+开机运行)

这个websocket服务端,本质上是一个php进程+参数。想想我们运行apache、运行qq,无非就是写成系统服务启动、双击启动、建立快捷方式双击启动等等。甚至你可以写一个程序来调用windows api创建进程来启动,但是你还是得想我们怎么启动这个启动进程的进程,哈哈。

CMD是最简单的创建带参数进程的方法了。


补充回答

是你理解有误。html页面和websocket是没有关联的。是你使用的websocket服务端把http的html页面和websocket的后端服务集成在一个命令里面,才造成了你的疑惑。我建议你直接抛弃它自带的http服务器。直接用浏览器打开本地的html文件。你就会明白,html页面和websocket服务器没有任何关系。

这篇关于socket.io - 关于php websocket的几点疑问?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆