websocket
运行的时候必须是在CLI
模式下吗?也就是必须要打开cmd命令窗口
吗?如果是必须要打开cmd
的话,会不会很麻烦?简单的聊天室系统是让用户访问同一个网站的同个端口,如果我两个页面或者多个页面进行数据操作该如何操作?
websoket
的时候,js
如何向服务端发送数据保证页面不跳转?现在好像只能通过点击url
的方式把数据发送给服务端,ajax
好像是不行有没有不通过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的程序员提出的独立思考过的问题。尽管问题中有一些信息不全,但是它是应该得到一个认真的回答、友善的纠正,而不是嘲讽。
下面开始答题
是的,传统php页面访问,是访问一次运行一次,运行结束就结束php进程。但是websocket是常驻内存的进程,必须由命令行启动。调试、开发时,我们一般都是使用一个CMD窗口来运行它,这并不会麻烦,而且我们修改了代码,需要重新启动一下,不然代码不会生效。线上环境时,我们可以将它写成一个service脚本来开机启动。或者使用supervisor这种进程管理软件来启动它。
其实你这个问题可以理解成,如何从一个端口提供一个聊天室变成一个端口提供多个聊天室。我们可以用聊天室id来区分,也可以用聊天室url来区分。都只是一个聊天室标记而已。
为了实现这一点,我们需要为每个连接到服务端的用户记录一个
此用户所属聊天室
的标记,每次收到的用户消息,我们也要求他得有一个要发送到的聊天室
标记,然后我们在服务端群发用户消息时,就不是直接无脑发给所有用户了。而是在循环时判断一下,如果此用户所属聊天室
=要发送到的聊天室
则发送,否则略过这个用户。至此即实现了多聊天室应用。如果这个是发送消息的代码的话,那改成ajax是可行的。至于为什么你说ajax不行,还请给出“不行”的症状。光说你病了,但是不告诉医生你的症状,是没法诊断的。
linux参考第一条的supervisor。windows可以参考bat脚本(定时+隐藏+开机运行)
这个websocket服务端,本质上是一个php进程+参数。想想我们运行apache、运行qq,无非就是写成系统服务启动、双击启动、建立快捷方式双击启动等等。甚至你可以写一个程序来调用windows api创建进程来启动,但是你还是得想我们怎么启动这个启动进程的进程,哈哈。
CMD是最简单的创建带参数进程的方法了。
补充回答
是你理解有误。html页面和websocket是没有关联的。
是你使用的websocket服务端把http的html页面和websocket的后端服务集成在一个命令里面,才造成了你的疑惑
。我建议你直接抛弃它自带的http服务器。直接用浏览器打开本地的html文件。你就会明白,html页面和websocket服务器没有任何关系。