websocket怎么才能让两个人都能发消息?

已经发起了离职流程,工作交接的空暇时间,来搞点事情吧。博主的水平属于菜逼型,html,js,java勉强会写一点点,websocket也仅知道是个长接连,如果你连这个都不知道。建议先自行补习一下。 接下来讲咱们要做什么东西吧,就是一个五指棋游戏,然后有个大厅,可以去开房,然后就可以跟棋友啪啪啪下棋了。看起来好像很简单,但我们还是从更简单的开始吧。

第一期的目标我们是搭建一个webSocket的服务器,然后做一个简单的五指棋,然后连接上去的两个人就可以开始下棋啦。也不考虑各种bug啦。

首先是搭建一个webSocket的服务器,网上好多都是spring+WebSocket的,不过不用spring框架也是ok的。 这边提供一个简单的demo吧。(请等我上传,哈哈哈)。点注解进去可以发现一些可选的参数,反正我们现在也不用。

然后需要Tomcat启动。 这么一个webSocket的服务器就搭建完了,然后咱们就来实现五指棋的逻辑咯。后端的逻辑分为两部分,第一是等待连接(没两个人下什么棋呢),第二步是客户端开始下棋,进行广播。

代码比较简单的,(因为并没有进行详细的规划,所以前后交互的数据格式也是比较扯淡的,后面会做的比较好,暂时就这样吧,以json的格式).数据封装成一个Action,然后传给前端。

第二部分:第二部分的逻辑比较简单,接收到某一方下棋的指令,进行下棋,然后广播所有的链接,跟他们说,这个人下了个棋啦。

这里需要注意的是,最原始的版本我们是不在服务端保存棋盘的。所以是存在一定问题的,后面再搞一搞咯。

前端代码是网上扒一个单机的版本进行改造的,重点讲几部分吧。创建一个webSocket的链接

其他的画布呀,画一个五指棋出来什么的,大家网上扒一扒就行,或者直接下载源码就ok了。

第一期我们就简单地搭建了一个简单的在线五指棋。当然这当中存在相当多的问题,例如:没有房间呀,链接数超过3个人有问题呀,下到一半刷新的问题呀,服务器没有校验操作,数据交互等等等。。。 没事,后面我们再继续。 第一期的代码等下上次,里面有部分代码因为是从别的地方扒的,没什么卵用,但也没有删除,将就吧。

  • 前言 前面我们已经实现了一个简单的五指棋,但问题特别多。这一篇,我们要解决的问题有 新增房间 前端给出一些提示,告...

  • 1 前言 本文是做一款游戏的心路历程。(不完全是教程)代码部署地址 部署的版本不一定是最新的。其实已经打算放弃了,...

  • 前言 周末跟妹纸玩这个游戏,发现了两个问题 当页面存在滚动条时,下棋的位置不正确。 有时候会存在这么一个情况,下了...

  • 前言 之前我们已经完成了一个有房间的五指棋游戏,现在我们将进一步来完善这个东西。这一次我们打算新增的功能有: 之前...

  • 前言 最近有些突发的事情,在飞机上写了点代码,先把它们更新上来吧。毕竟这个文章是做这个东西的一个心路历程,可能有些...

  • 周末,首都交通大学第二教学楼,钟翰狭小的办公室里,这次终于堆了点书以外的东西。 “我喜欢把事情都框架化,系统化,这...

  • 回風細雨一霑衣,古道荒村行跡稀。 忽見漁舟連水岸,遙聞雞犬動柴扉。 寒巖紅葉飛幽徑,秋浦蒼苔滿釣磯。 我到靑山今是...

  • 从2016年7月,在全国思源校长会上,言爱提出借助互联网+,提升思源内动力发展。 一年期间,湖南思源成功通过石门思...

    两个人如何使用同一个vps服务器 内容精选 换一换

  • :配置为已启户A、户B、户C可以分别使用账号A、账号B、账号C同时登录云服务器,但是不支持户A、户B、户C使用同一个账号同时登录云服务器。 已禁:单个户同时多个登录的多户登录。 例:配置为已禁户A、户B、户C可以使用同一个账号同时登录云服务器。

  • 已启用:多个用户同时登录的多户登录,不能单个户多登录。 例:配置为已启户A、户B、户C可以分别使用账号A、账号B、账号C同时登录云服务器,但是不支持户A、户B、户C使用同一个账号同时登录云服务器。 已禁:单个户同时多个登录的多户登录。 例:配置为已禁户A、户B、用

  • 两个人如何使用同一个vps服务器 相关内容

  • 据您的实际需要自助配置应环境或相关软件。 私有镜像 户基于外部镜像文件或裸金属服务器创建的个人镜像,仅户自己可见。包含操作系统、预装的公共应以及户的私有应。选择私有镜像创建裸金属服务器,可以节省您重复配置裸金属服务器的时间。 共享镜像 将其他户共享的私有镜像,作为自己的镜像进行使用。

  • 服务器的安全性非常重要的一个方面,所以在日常生活中定要维护好,那么,服务器防火墙怎么配置呢?如何进入服务器防火墙?想知道的小伙伴们就跟着小编来看看相关内容的介绍吧。如何进入服务器防火墙如何检查服务器防火墙引起的端口不通服务器本身防火墙般有三地方需要检查:/videos/102987

  • 本示例中,数据库源端为ECS自建MySQL,目的端为RDS实例,同时假设ECS和RDS实例在同一个VPC中。部署架构图1所示。 果自建MySQL和RDS实例不在同一个VPC内,相比于相同VPC的情况,需要配置两个VPC的对等连接,部署架构图图2所示。 本文档中以同一VPC为例,如何配置两个VPC的对等连接请参考配置对等连接。

  • 域名”方式逐条添加。 同一防护域名不能重复添加到WAF云模式。 同一个域名对应不同端口视为不同的防护对象,例:8080和:8081为两个不同的防护对象,且占两个域名防护配额。果您需要防护同一域名的多个端口,您需要将该域名和端口逐一添加到WAF。

  • API请求的组成,并以调脸检测为例说明如何API,您还可以通过这个视频教程了解如何构造请求调API:/videos/102987。 请求URI

  • 认证鉴权 调接口有种认证方式,您可以选择其中种进行认证鉴权。 Token认证:通过Token认证通请求。 AK/SK认证:通过AK(Access Key ID)/SK(Secret Access Key)加密调请求。推荐使用AK/SK认证,其安全性比Token认证要高。

  • 在划分网段时还应考虑该网段的IP容量,即有多少可的IP数。 最多可以创建多少个子网? 一个户可以创建100子网,果无法满足实际需求,可以申请扩容。具体操作请参见什么是配额? 如何规划路由策略? 路由表由系列路由规则组成,于控制VPC内子网的出流量走向。户创建VPC时,系统会自动为其生成一个默认路由表,该默认路由表含义为VPC内网互通。

  • ?。 负载均衡的后端服务器可以反过来访问公网/私网负载均衡器上的端口吗?。 ELB可以绑定其他友商的EIP使用吗?。 删除弹性负载均衡时,删除按钮为灰色,无法删除,是什么原因?。 使用负载均衡必须配置带宽吗?。 一个负载均衡可以绑定多个EIP吗?。 创建/启独享型ELB后为什么会占用多个子网IP?。

  • 在划分网段时还应考虑该网段的IP容量,即有多少可的IP数。 最多可以创建多少个子网? 一个户可以创建100子网,果无法满足实际需求,可以申请扩容。具体操作请参见什么是配额? 如何规划路由策略? 路由表由系列路由规则组成,于控制VPC内子网的出流量走向。户创建VPC时,系统会自动为其生成一个默认路由表,该默认路由表含义为VPC内网互通。

  • 本示例中,数据库源端为ECS自建MySQL,目的端为RDS实例,同时假设ECS和RDS实例在同一个VPC中。部署架构图1所示。 果自建MySQL和RDS实例不在同一个VPC内,相比于相同VPC的情况,需要配置两个VPC的对等连接,部署架构图图2所示。 本文档中以同一VPC为例,如何配置两个VPC的对等连接请参考配置对等连接。

  • PC的情况,需要配置两个VPC的对等连接,部署架构图图2所示。 本文档中以同一VPC为例,如何配置两个VPC的对等连接请参考配置对等连接。 图1 同一VPC的部署架构 图2 不同VPC场景的部署架构

  • 构造请求 本节介绍REST API请求的组成,并以调IAM服务获取户Token接口说明如何API,该API获取户的Token,Token可以于调其他API时鉴权。 您还可以通过这个视频教程了解如何构造请求调API:/videos/102987

  • 同时拥有自定义路由和弹性公网IP的弹性云服务器访问外网的优先级是什么? 本地主机访问使用弹性云服搭建的网站出现间歇性中断怎么办? 同一个子网下的弹性云服务器只能通过内网IP地址单向通信怎么办? 同一个VPC内的弹性云服务器无法互通或者出现丢包等现象时,如何排查? 为什么对等连接创建完成后不能互通?

  • 区指在同一区域下,电力、网络隔离的物理区域,可区之间内网互通,不同可区之间物理隔离。 果您需要提高应的高可性,建议您将弹性云服务器创建在不同的可区。 果您需要较低的网络时延,建议您将弹性云服务器创建在相同的可区。 随机分配:创建云服务器时可以选择随机分配可区,

  • 户创建一个SFS容量型文件系统A,文件系统使用的是VPC-B,网段为:8080和:8081为两个不同的防护对象,且占两个域名防护配额。果您需要防护同一域名的多个端口,您需要将该域名和端口逐一添加到WAF。

  • 么? 如何区分不同IAM账户创建的短信应? 想发送不同类型的短信该如何操作? 短信应的作是什么? 认证问题 个人户能使用消息&短信服务吗? BP账户能使用消息&短信服务吗? IAM户能使用消息&短信服务吗? 合作伙伴账号能使用短信服务吗? 消息&短信服务是否支持海外站点接入?

两个人如何使用同一个vps服务器

提交成功!非常感谢您的反馈,我们会继续努力做到更好 反馈提交失败!请稍后重试!

一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻烦的是前端展..于是..

要实现功能,首先要做前端,经过对比其他网站的在线聊天功能,发现除了基本的聊天功能以外,还要注意以下几点.

1.一次只能和一个人聊天,但是可以随意切换其他人.
2.如果用户是从"发送消息" 入口进来的,那么当前马上就切换到对应的聊天窗口,而且如果之前有过聊天记录,应该把聊天记录也展示出来.
3.如果是从"我的消息" 入口进来的,那么应该不显示任何聊天记录.等待选择聊天对象.
4."我"发送的消息显示在右边,"对方"发送的消息显示在左边,也可以相反,总之要不一样.
5.切换聊天的时候不能刷新整个页面,否则体验很差. 发送消息也同理,所以应该用ajax.
6.要保证在线聊天的及时性,应该每隔一段很短的时间,就要与服务端通信,也就是说要轮询ajax.

经过简单的需求分析,然后又找了找其他的网站,对比了一下功能在界面的展示,最终确定界面. 然后花了几个小时做好了.

这是最终全部做完(包括后端) 的效果.

点击左侧可以切换,下方多行文本框,输入聊天信息,然后点击发送.

整个流程大概就是这样.

回头来看需求, 很明显,首先要有一张表格,存放双方的对话,想了想决定这样定义字段:
user_id 表示消息发送的主体

这样定义的好处是,可以轻易从一条消息中轻易辨别哪个是发送方,哪个是接收方,为前端的展示做准备.

有了这张表,就可以通过当前登录的session中的用户ID, 去进行查询,可以得知在跟哪些人聊天. 但是这样并不方便,而且要进行复杂的处理.

1.假设有一条消息是己方发送的,那么就插入数据 ‘己方’ ‘对方’ ‘内容’,同时可以知道当前聊天中的一个人是’对方’.
2.但是假设有一条消息是对方发送的,对当前用户来说,数据就是 ‘对方’ ‘己方’ ‘内容’.

也就是说,想要实现多人聊天,就要获取当前正在跟 ‘我’ 聊天的用户们.不论是对方发送的,还是 ‘我’ 发送的,都应该计算在内. 要对数据库遍历两次,而且很多对当前来说是重复,无用的数据. 在”获取聊天对方的主体” 这一步时, 只需要知道两个人是否有聊天关系即可,具体内容不用关心.

所以还要一张聊天关系表. 我是这样定义字段的:

其中user_id 和 chat_user 为双主键,不能同时相等. 这样就只记录了聊天关系,不记录聊天内容,搜索起来也方便得多.

举个例子 第一个字段表示 我与ID为9的用户 有一个聊天关系, 所以在’我’的界面上,就应该有这个用户. 同理 第二条字段表示 对方与我有聊天关系,那么在对方的界面上,就要有我这个用户.

一般来说聊天关系是相互的, 但是也可以删除. 删除聊天关系并不等于删除聊天记录.
比如,在我的界面上,我把与9号用户的聊天关系删除了,那么我就看不到与9号用户的聊天信息了, 但是对9号用户来说,我还在他的界面上,随时可以向我发送消息. 当他向我发送消息时,服务端又要生成一条数据 ‘我’ ‘对方’ ,这样,我与对方的聊天关系又建立起来了,同时,聊天记录一直都没有被删除过,所以,当重新建立聊天关系时,可以展示出聊天记录.

而且,删除聊天关系后, 我也可以重新发起聊天, 再次建立聊天关系.
所以这张表建立之后提供很多方便, 上面分析的需求,展示聊天记录,也可以很好的完成.

代码就不放了,说一下实现思路

首先,主要功能有一个控制器,两张表,两个模型. 至于头像,昵称什么的,不计算在主要功能内.

1.showPage() ,用来应对非ajax请求,用户通过浏览器访问时,比如第一次进入聊天界面,就是通过浏览器访问的,这时候调用showPage方法,这时候,后台只获取聊天关系(第四个方法),展示在界面左侧. 其他不作处理.

2.newChat(),用来应对非ajax请求, 比如我通过用户个人资料页面,点击发送消息,这时候就调用这个方法. 先判断聊天关系是否存在,如果存在就不处理,如果不存在,就插入一个聊天关系. 并且要获取所有聊天关系(第四个方法),最新的排上面,把用户ID转到界面上.为后面做准备.

‘我’ 这个用户来到聊天界面上后, 前端就开始进行ajax轮询.不停访问getChatText()这个方法. 这时有两种情况.

1 当前正在与某个用户聊天,js就发送一个请求到getChatText方法,参数是对方的用户ID. 因为'我'的ID 可以从服务端session获取到.然后通过这两个信息去数据库获取聊天消息.返回json格式,js进行数据处理,节点操作,等等,然后把消息展示出来.
2.当前没有正在与某个用户聊天,那ajax暂不启动,当选择了聊天对象的时候再启动轮询.

4.getChatTemp()方法,获取当前登录用户的聊天关系. 作为一个工具函数,供第一个和第二个函数使用.

5.pushChat(),用来应对ajax请求, 也就是发送消息请求. 把聊天消息插入数据库而已.

总体实现了在线聊天的基本功能,但是有缺陷, 获取聊天消息的时候,我是无论有没有新消息,都全部获取到. 然后清空聊天框,再填充.
这样的结果是, 当聊天信息很多的时候,滚动条会有问题, 每次发送消息,滚动条都会先滚动到最上面,再滚动下来. 有个解决方案是,在聊天关系上加一个字段,存储两个人的消息数. 获取完数据的时候,先统计一下,看看是不是比原来的多了,如果多了,就只获取多的数据,然后更新消息数目. 如果没多,那就舍弃数据,不做处理.

其实一开始就是这么想的,但是不知道后面为什么又做成了全部获取.

我要回帖

更多关于 websocket如何保持长连接 的文章

 

随机推荐