问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

html5的websocket和php的socket分别完成客户端与服务器端的通信过程。

发布网友 发布时间:2022-05-12 02:59

我来回答

3个回答

懂视网 时间:2022-05-12 07:20

本篇文章主要介绍了HTML5-WebSocket实现聊天室示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

在传统的网页实现聊天室的方法是通过每隔一段时间请求服务器获取相关聊天信息来实现,然而html5带来的websocket功能改变这了这种方式.由于websocket在连接服务器后允许保持连接来进行数据交互,因此服务器可以主动地向客户端发送相应的数据.对于html5的处理只需要在连接创建完成后在websocket的receive事件中处理接收的数据即可.下面通过实现一个聊天室来体验一下服务器可以主动地向客户端发的功能.

功能

一个简单的聊天室主要有以下几个功能:

1)注册

注册要处理几个事情,分别是注册完成后获取当前服务器所有用户列表,服务把当前注册成功的用户发送给其他在线的用户.

2)发信息

服务器把当前接收的消息发送给在线的其他用户

3)退出

服务器把断开的用户通知其他用户

聊天室完成的功能预览如下:

C#服务端代码

服务端的代码只需要针对几功能定义几个方法即可,分别是注册,获取其他用户和发送信息.具体代码如下:


/// <summary>

 /// Copyright ? henryfan 2012 

 ///Email: henryfan@msn.com 

 ///HomePage: http://www.ikende.com 

 ///CreateTime: 2012/12/7 21:45:25

 /// </summary>

 class Handler

 {

 public long Register(string name)

 {

  

  TcpChannel channel = MethodContext.Current.Channel;

  Console.WriteLine("{0} register name:{1}", channel.EndPoint, name);

  channel.Name = name;

  JsonMessage msg = new JsonMessage();

  User user = new User();

  user.Name = name;

  user.ID = channel.ClientID;

  user.IP = channel.EndPoint.ToString();

  channel.Tag = user;

  msg.type = "register";

  msg.data = user;

  foreach (TcpChannel item in channel.Server.GetOnlines())

  {

  if (item != channel)

   item.Send(msg);

  }

  return channel.ClientID;

 }

 public IList<User> List()

 {

  TcpChannel channel = MethodContext.Current.Channel;

  IList<User> result = new List<User>();

  foreach (TcpChannel item in channel.Server.GetOnlines())

  {

  if (item != channel)

   result.Add((User)item.Tag);

  }

  return result;

 }

 public void Say(string Content)

 {

  TcpChannel channel = MethodContext.Current.Channel;

  JsonMessage msg = new JsonMessage();

  SayText st = new SayText();

  st.Name = channel.Name;

  st.ID = channel.ClientID;

  st.Date = DateTime.Now;

  st.Content = Content;

  st.IP = channel.EndPoint.ToString();

  msg.type = "say";

  msg.data = st;

  foreach (TcpChannel item in channel.Server.GetOnlines())

  {

  item.Send(msg);

  }
 }
 }

只需要以上简单的代码就完成了聊天室服务端的功能,对于用户退出可以通过连接释放事件来做处理具体代码:


protected override void OnDisposed(object sender, ChannelDisposedEventArgs e)

 {

  base.OnDisposed(sender, e);

  Console.WriteLine("{0} disposed", e.Channel.EndPoint);

  JsonMessage msg = new JsonMessage();

  User user = new User();

  user.Name = e.Channel.Name;

  user.ID = e.Channel.ClientID;

  user.IP = e.Channel.EndPoint.ToString();

  msg.type = "unregister";

  msg.data = (User)e.Channel.Tag;

  foreach (TcpChannel item in this.Server.GetOnlines())

  {

  if (item != e.Channel)

   item.Send(msg);

  }

 }

这样聊天定的服务端代码就已经完成了.

JavaScript代码

对于html5代码首先要做的一件事就是连接到服务器,相关javascript代码如下:


通过Receive回调池数来处理不同消息的情况,如果是接收到其他用户的注册信息,则把用户信息添加到列表中;如果收到的其他用户的退出信息则在用户列表种移走;直接收到消息添加到消息显示框中即可.有jquery的帮助以上事件都变得非常简单.

用户注册调用过程:


获取在线用户列表过程:


发送消息过程:


代码下载:demo

总结

经过代码封装后websocket的处理变得非常简单,如果你有兴趣完全可以在此代码上扩展出一个更多功能的聊到室,如聊天室分组,发送信息图片共享等等.

热心网友 时间:2022-05-12 04:28

<?php
echo ' web-root = '.$_SERVER['DOCUMENT_ROOT'].'<br>';
echo ' current-file = '.__FILE__.'<br>';
echo ' current-dir = '.dirname(__FILE__).'<br>';

echo ' http-root = '.$_SERVER['HTTP_HOST'].'<br>';
echo ' web-position = '.$_SERVER['PHP_SELF'].'<br>';

$file='c:/webroot/index.php';
echo ' file-position = '.$file.'<br>';

$fileWebAddress='http://'.str_replace($_SERVER['DOCUMENT_ROOT'],$_SERVER['HTTP_HOST'],$file);
echo ' file-web-position = '.$fileWebAddress.'<br>';

?>

热心网友 时间:2022-05-12 05:46

启动php sever服务

client新建一个websocket对象连接后端

client发送数据给后端

服务器接受数据后返回数据

client接收到返回数据继续下一步

我这边有个聊天室的demo就是这样做的,很简答

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
海关老师:你好. 如果是加工贸易手册报关的话,报关单价要与手册备案的... 上海危险品报关公司哪家好 长辈可以为老不尊出口成脏晚辈们却连句重话也不能对长辈说试问这样的长... 老一辈为什么这么喜欢拿态度说事? 系统集成项目管理工程师(一):信息化知识 "压哨"的英语怎么拼啊 周山打鱼的年薪多少钱 望穿秋水(打一动物)谜底及原因 想买一本词典 古代汉语字典买哪一种版本比较好? 如何在 Debian / Ubuntu 服务器上架设 L2TP / IPSec 如何在 Debian / Ubuntu 服务器上架设 L2TP / IPSec 驼色修身大衣应该配宽松还是紧身内搭好看? 我有一个联通靓号,户名不是我,但一直是我用,怎么过户到我的名下 xz140x50x20x2每米重量 移动靓号过户如何办理 iPhone6 plus防不防水? 想下载的某种格式的文件,怎么在网上找? 怎样下载dat格式文件? FLASH 格式文件下载 dbf格式文件怎么下载 机械制图中的局部制图是要显示哪些部分? 机械制图中放大图的尺寸标注要按照放大倍数标注还是按原尺寸标注?请各位帮忙?我不清楚这个…… 机械制图的标题栏比例为1:2,图纸上的局部放大图比例为4:1,实际长度为5的线段在局部放大图绘制: 阳男 水2局 生肖 鼠 定盘日期:阳历 西元1984年8月18日未时 阴历 甲子(1984)年7月22日未时 你好,请问机械制图的局部放大图中能否再局部放大? 1973农历7月22日2011运势如何请帮忙测算 农业年7月22日是什么星座? 机械制图局部放大图的尺寸是和基图一样吗, 所以这里话放大图尺寸全都乘4对吗?话说基图的这个地方怎么 2010年结婚吉日男属牛七月女属鼠十一月 会计有哪些等级? 会计的最好等级是什么 wps下的是专业版的,还要再下什么才能打开宏呢,求指教 橙子皮可以洗脸么可以去眼袋和黑眼圈么 各位,首保做完油耗会不会低下来 首保后油耗是不是一定会下降 新车首保后会降低油耗吗 怎么更改word文档的用户信息 首保前和首保后,你们的油耗有变么 1.4T探岳,大身躯小心脏的首保初体验! websocket聊天室怎样监听一个端口实现多个聊天房间 在会议过程中如何快速、准确地记录会议信息? 多地机关及企事业单位限期打疫苗,要求7月底前完成接种,此举意味着什... 多地要求各单位7月底前完成疫苗接种,为什么会发出这样的通知?_百度... 多地通知:未接种新冠疫苗将影响出行,新一轮新冠疫苗接种对象包含哪些人? 12320咨询服务范围 接种新冠疫苗,我们要7月15日才能接种第一针,到时应该还有疫苗吗?_百度问一问 哪些省份开始了新冠疫苗加强针的接种了呢? 多地发布限期接种新冠疫苗通知,接种新冠疫苗有多重要? 国药集团奥密克戎灭活疫苗获批,这对现下抗击疫情有何帮助? 智能制造核心企业和高新技术产业是不是一个概念,有什么区别?