如何用PHP实现WebSocket网页实时聊天功能?

2026-04-06 07:181阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计757个文字,预计阅读时间需要4分钟。

如何用PHP实现WebSocket网页实时聊天功能?

目录+前言+WebSocket+简介+与HTTP的关系+实操+数据传输+PHP+实现WebSocket+服务器+文件描述符+创建服务器socket+服务器逻辑+客户端+创建客户端+页面功能+用户名异步处理+总结+前言+最近挑战

目录
  • 前言
  • websocket
    • 简介
    • 与127.0.0.1:8080"); // websocket 创建成功事件 ws.onopen = function () { }; // websocket 接收到消息事件 ws.onmessage = function (e) { var msg = JSON.parse(e.data); } // websocket 错误事件 ws.onerror = function () { };

      发送消息也很简单,直接调用 ws.send(msg) 方法就行了。

      页面功能

      页面部分主要是让用户使用起来方便,这里给消息框 textarea 添加了一个键盘监控事件,当用户按下回车键时直接发送消息;

      function confirm(event) { var key_num = event.keyCode; if (13 == key_num) { send(); } else { return false; } }

      还有用户打开客户端时生成一个默认唯一用户名;

      然后是一些对数据的解析构造,对客户端页面的更新,这里就不再啰嗦了,感兴趣的可以看源码。

      用户名异步处理

      这里不得不提一下用户登陆时确定用户名时的一个小问题,我原来是想在客户端创建一个连接后直接发送用户名到服务器,可是控制台里报出了 “websocket 仍在连接中或已关闭” 的错误信息。

      Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

      如何用PHP实现WebSocket网页实时聊天功能?

      考虑到连接可能还没处理好,我就实现了 sleep 方法等了一秒再发送用户名,可是错误仍然存在。

      后来忽然想到 js 的单线程阻塞机制,才明白使用 sleep 一直阻塞也是没有用的,利用好 js 的事件机制才是正道:于是在服务器端添加逻辑,在握手成功后,向客户端发送握手已成功的消息;客户端先将用户名存入一个全局变量,接收到服务器的握手成功的提醒消息后再发送用户名,于是成功在第一时间更新用户名。

      总结

      聊天室扩展方向

      简易聊天室已经完成,当然还要给它带有希望的美好未来,希望有人去实现

      • 页面美化(信息添加颜色等)
      • 服务器识别 '@' 字符而只向某一个 socket 写数据实现聊天室的私聊
      • 多进程(使用 redis 等缓存数据库来实现资源的共享)
      • 消息记录数据库持久化(log 日志还是不方便分析)

      以上就是如何用PHP websocket实现网页实时聊天的详细内容,更多关于用PHP websocket实现网页实时聊天的资料请关注自由互联其它相关文章!

本文共计757个文字,预计阅读时间需要4分钟。

如何用PHP实现WebSocket网页实时聊天功能?

目录+前言+WebSocket+简介+与HTTP的关系+实操+数据传输+PHP+实现WebSocket+服务器+文件描述符+创建服务器socket+服务器逻辑+客户端+创建客户端+页面功能+用户名异步处理+总结+前言+最近挑战

目录
  • 前言
  • websocket
    • 简介
    • 与127.0.0.1:8080"); // websocket 创建成功事件 ws.onopen = function () { }; // websocket 接收到消息事件 ws.onmessage = function (e) { var msg = JSON.parse(e.data); } // websocket 错误事件 ws.onerror = function () { };

      发送消息也很简单,直接调用 ws.send(msg) 方法就行了。

      页面功能

      页面部分主要是让用户使用起来方便,这里给消息框 textarea 添加了一个键盘监控事件,当用户按下回车键时直接发送消息;

      function confirm(event) { var key_num = event.keyCode; if (13 == key_num) { send(); } else { return false; } }

      还有用户打开客户端时生成一个默认唯一用户名;

      然后是一些对数据的解析构造,对客户端页面的更新,这里就不再啰嗦了,感兴趣的可以看源码。

      用户名异步处理

      这里不得不提一下用户登陆时确定用户名时的一个小问题,我原来是想在客户端创建一个连接后直接发送用户名到服务器,可是控制台里报出了 “websocket 仍在连接中或已关闭” 的错误信息。

      Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

      如何用PHP实现WebSocket网页实时聊天功能?

      考虑到连接可能还没处理好,我就实现了 sleep 方法等了一秒再发送用户名,可是错误仍然存在。

      后来忽然想到 js 的单线程阻塞机制,才明白使用 sleep 一直阻塞也是没有用的,利用好 js 的事件机制才是正道:于是在服务器端添加逻辑,在握手成功后,向客户端发送握手已成功的消息;客户端先将用户名存入一个全局变量,接收到服务器的握手成功的提醒消息后再发送用户名,于是成功在第一时间更新用户名。

      总结

      聊天室扩展方向

      简易聊天室已经完成,当然还要给它带有希望的美好未来,希望有人去实现

      • 页面美化(信息添加颜色等)
      • 服务器识别 '@' 字符而只向某一个 socket 写数据实现聊天室的私聊
      • 多进程(使用 redis 等缓存数据库来实现资源的共享)
      • 消息记录数据库持久化(log 日志还是不方便分析)

      以上就是如何用PHP websocket实现网页实时聊天的详细内容,更多关于用PHP websocket实现网页实时聊天的资料请关注自由互联其它相关文章!