这是一个好问题,是一个真正试图学习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服务器没有任何关系。