websocket 实现简易聊天室

简单的例子

Websocket握手

客户端发送:

GET / HTTP/1.1
Host: 192.168.1.213:8999
Connection: Upgrade
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xmcdcwN39t4dE4YsqCkqzA==

服务器端相应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Sec-WebSocket-Version: 13
Connection: Upgrade
Sec-WebSocket-Accept: XjYWBVMYrP+XK8AlZ8CVRuaWBy4=
  • Connection 必须设置 Upgrade,表示客户端希望连接升级。

  • Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。

  • Sec-WebSocket-Key 是随机的字符串。

  • Sec-WebSocket-Accept 服务器端拿到客户端Sec-WebSocket-Key传过来的随机字符串,然后拼接"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",进行sha1计算后,在进行base64编码,返回给客户端:

base64_encode(sha1(Sec-WebSocket-Key的值 . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true))

客户端

创建 WebSocket 对象

var ws = new WebSocket("ws://192.168.1.213:8999");

监听服务器返回的数据

ws.onmessage = function (e) {
	// ---
}

往服务器端发送数据

ws.send(JSON.stringify(data));

关闭连接

ws.onclose = function() { 
   // 关闭 websocket
};

服务器端

<?php
$host = '0.0.0.0';
$port = 9999;
// 创建一个socket套接字
$listen_socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
// 将socket bind到IP:port上
socket_bind( $listen_socket, $host, $port );
// 开始监听socket
socket_listen( $listen_socket );
// 进入while循环,不用担心死循环死机,因为程序将会阻塞在下面的socket_accept()函数上
while( true ){
  // 此处将会阻塞住,一直到有客户端来连接服务器。阻塞状态的进程是不会占据CPU的
  // 所以你不用担心while循环会将机器拖垮,不会的 
  $connection_socket = socket_accept( $listen_socket );
  // 向客户端发送一个helloworld
  $msg = "helloworld\r\n";
  socket_write( $connection_socket, $msg, strlen( $msg ) );
  socket_close( $connection_socket );
}
//关闭连接
socket_close( $listen_socket );
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值