websocket和基于swoole的简易即时通讯
这里描述个基于swoole的websocket 匿名群聊
UI
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>即时通讯系统</title>
<link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
</head>
<body>
<div id="convo">
登录用户id:<input type="text" name="user" >
<button class="login">登录</button>
<ul class="chat-thread">
</ul>
<!--聊天框-->
<div class="chat-window">
<input class="chat-window-message" name="chat-window-message" autocomplete="on" placeholder="请输入内容按回车键发送" type="text" value="123">
</div>
</div>
<!--引入jq文件-->
<script src='jquery.js'></script>
<script type="text/javascript">
$('.login').on('click' , function(){
uid = $('[name=user]').val().trim();
if(uid ==''){
alert('请先登录');
}else{
socketlogin(uid);
}
})
var socket;
function socketlogin(uid){
socket=new WebSocket('ws://103.60.221.52:9502?uid=' + uid);
socket.onopen=function()
{
socket.send(setMsg(1,'用户'+uid+"你好",uid));
console.log('连接成功');
}
socket.onmessage=function(e)
{
console.log('接收数据');
console.log(e);
$('.chat-thread').append('<li class="left">'+e.data+'</li>');
}
socket.onclose= function()
{
$('.chat-thread').append('<li class="left">退出聊天室</li>');
}
}
$(document).keydown(function(e){
if(e.keyCode==13){
var speak=$('.chat-window-message').val();
$('.chat-thread').append('<li>'+speak+'</li>');
$('.chat-window-message').val('');
socket.send(setMsg(2,speak,uid));
}})
function setMsg(type,msg , uid){
var msgObject = {
type:type,
msg: msg ,
uid: uid ,
}
return JSON.stringify(msgObject);
}
</script>
server.php
<?php
// 存储在线客户的数组
$userFdList = [];
$server = new swoole_websocket_server("0.0.0.0", 9502);
$server->on('open',function($server,$requset) use(&$userFdList){
//$userFdList[$request->get['uid']] = $request->fd ; 用于给特定人发送情况
$server->push($requset->fd,"欢迎来到同性交友群");
});
$server->on('message',function($server,$frame) use(&$userFdList){
$datas = json_decode($frame->data , true);
// var_dump($datas);
// var_dump($userFdList);
//匿名群聊
foreach($server->connection_list() as $key =>$val){
$server->push($val,"{$datas['msg']}");
}
// 特定人发送
// if($datas['type'] == 1){
// $server->push($userFdList[$datas['uid']], "系统:{$datas['msg']}");
// } else if( !isset($userFdList[$datas['to_uid']])) {
// $server->push($userFdList[$datas['uid']], "系统:用户没上线");
// } else {
// $server->push($userFdList[$datas['to_uid']], "别人(uid:{$datas['uid']}):{$datas['msg']}");
// }
// $server->push($frame->fd,{$frame->data});
});
$server->on('close', function($server, $fd) use (&$userFdList){
echo "connection close: {$fd}\n";
// 特定人发送
// foreach ($userFdList as $key => $value) {
// if( $value == $fd ) unset($userFdList[$key]);
// }
});
$server->start();
?>



作者:云窗96
链接:https://www.jianshu.com/p/2b2a70f7b557
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
websocket和基于swoole的简易即时通讯的更多相关文章
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- 通过python的socket库实现简易即时通讯小程序
前言 最近学习了一下有关tcp协议和socket有关的知识,看到许多socket实战都喜欢教如何做一个聊天程序,于是想着试试能不能不看教程自己写一个.当然我没太多时间做一个像qq一样的ui界面,所以做 ...
- C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
- Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架
一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- openfire+asmack搭建的安卓即时通讯(一) 15.4.7
最进开始做一些android的项目,除了一个新闻客户端的搭建,还需要一个实现一个即时通讯的功能,参考了很多大神成型的实例,了解到operfire+asmack是搭建简易即时通讯比较方便,所以就写了这篇 ...
- web 端即时通讯
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
随机推荐
- 批量下载文件JSP
最近项目有个需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案.项目框架基于SSMservice业务实现层(impl):// ...
- signup图片上传预览经常总结
html <html> <head> <meta charset="utf-8" /> <meta http-equiv="X- ...
- 170905-MyBatis中的关系映射
===关系映射=== 参考文档复习:1对1,1对多,多对多 1.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其 ...
- kali语言设置
1.直接在终端命令 dpkg-reconfigure locales 然后按需选择支持字符编码:en_US.UTF-8(英文).zh_CN.GBK(中文).zh_CN.UTF-8(中文) (注:选择字 ...
- SQL 多表查询的几种连接方式
--创建数据库 create database GoodsSystem go --使用数据库 use GoodsSystem go --创建商品类型表 create table GoodsType ( ...
- anaconda 下载包速度慢
更新清华镜像资源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda ...
- 北风设计模式课程---开放封闭原则(Open Closed Principle)
北风设计模式课程---开放封闭原则(Open Closed Principle) 一.总结 一句话总结: 抽象是开放封闭原则的关键. 1."所有的成员变量都应该设置为私有(Private)& ...
- 消息队列之 ActiveMQ
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- 三十六、python 中subprocess介绍
import subprocess 1.执行系统命令subprocess.call('ipconfig') #shell=False时,拼接命令分开写,放在列表中,等于True时,可写一块,空格隔开例 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_7_字节输出流的续写和换行
再执行一次.内容会追加在后面 换行 不同系统下的换行符号 每次都写上换行符号,在for循环里面,循环10次