websocket c 实现断线重连怎么实现的

WebSocket 断开自动重连的 JavaScript 库
前端同学由 html5 开始切入 socket 编程, node.js 则是另外一个切入点。
ReconnectingWebSocket 是一个小型的 JavaScript 库,封装了 WebSocket API 提供了在连接断开时自动重连的机制。
只需要简单的将:
ws = new WebSocket('ws://....');
ws = new ReconnectingWebSocket('ws://....');
整理,转载请保留以上信息; 如有侵犯您的版权, 请联系 @ 。
本文收录于
- 做一个有思想、没理想的 2B 技术青年!
- 搜寻思想的素材,探索地狱的大门。找死!孜孜不倦的...
- 佛说,从天而降的毛毛虫,容易被订在复活的十字架上
* 本站内容基本上来自互联网,
特别感谢各位原作者。 如有侵犯版权之处,烦请邮件联系
* All of the articles come from Internet, thanks to original authors, if anything about COPYRIGHT, or LEFT, please
* 之所以建站一方面是练练手,另外也是让自己跟得上技术的进步,形成自己的资料库和思想材料库;同时最好能跟有相同爱好的小伙伴们共同交流进步。
* 整理过程中,不一定每篇都看, 有条件和想法的时候会把自己的看法编辑进去;内容有时候也不局限于 web , 各种好玩的都可能收藏过来。
* 想法很多,时间有限;一有空就不断完善中!
分享交流站多个websocket连接处理--简易聊天室
&该程序可以实现多个用户之间(多个浏览器)之前的聊天功能,比如打开火狐,Opera,chrome,再其中每一个当中输入内容,另外的两个都会收到发布的内容,但是不能显示是谁发的信息,下一步我会完善
新建web项目,别忘了导入我们的Jar包
新建main.html
charset="utf-8"&
&title&多个websocket通信的实例&/title&
rel="stylesheet" type="text/css"
href="css/chat.css"&
src="js/jquery.js"&&/script&
//首先判断浏览器是否支持我们的websocket
if(!window.WebSocket&&window.MozWebSocket)
window.WebSocket=window.MozWebS
if(!window.WebSocket)
alert("此浏览器不支持WebSocket!");
&//WebSocket
&//页面显示时候的处理
&$(document).ready(function()
& prepareChat();
//我们聊天的初始化
prepareChat()
//首先创建我们的连接
WebSocket("ws://"+location.host+"/WebSocketChatRoom/ChatDeal");
//连接建立后调用的函数
ws.onopen=function()
*").attr("disabled",false);
//接收服务器传入的数据时候的处理
ws.onmessage=function(event)
//向聊天室当框中追加信息
chatLog=$("#chatLog");
chatLog[0].innerHTML+="&div
class='chatMsg'&"+event.data+"&/div&";
//用户点击提交按钮的处理
function sendMsg()
message=$("#message").val();
//向服务器发送信息
ws.send(message);
$("#message").val("");
&h2&多个websocket通信的实例&/h2&&
&form onsubmit="return
id="chatLog"&&/div&
&input type="text" id="message" disabled
required="required"&
&button onclick="sendMsg()"
disabled&提交&/button&
创建servlet
com.hanqing.
java.io.IOE
java.util.S
java.util.concurrent.CopyOnWriteArrayS
javax.servlet.http.HttpS
javax.servlet.http.HttpServletR
org.eclipse.jetty.websocket.WebS
org.eclipse.jetty.websocket.WebSocketS
public class ChatDeal extends
WebSocketServlet
public final
Set&ChatWebSocket& users=new
CopyOnWriteArraySet&ChatWebSocket&();
public WebSocket
doWebSocketConnect(HttpServletRequest arg0, String
System.out.println(users.size());
// TODO Auto-generated method
return new
ChatWebSocket(users);
//进行处理websocket的类
public class ChatWebSocket
implements WebSocket.OnTextMessage
//连接对象
private Connection
//所有用户的集合
Set&ChatWebSocket&
ChatWebSocket()
ChatWebSocket(Set&ChatWebSocket&
this.users=
public void onClose(int arg0,
String arg1) {
users.remove(this);
public void onOpen(Connection
connection) {
this.connection=
users.add(this);
//接收从客户端而来的数据时候被调用
public void onMessage(String
//System.out.println(data);
//对所有用户送出信息
for(ChatWebSocket
user:users)
user.connection.sendMessage(data);
} catch (IOException e)
e.printStackTrace();
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 4621259
博文数量: 694
博客积分: 2150
博客等级: 上尉
技术积分: 12214
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 架构设计与优化
TCP连接简介
当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,
当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
连接的建立是需要三次握手的,而释放则需要4次握手,
所以说每个连接的建立都是需要资源消耗和时间消耗的
经典的三次握手示意图:
经典的四次握手关闭图:
一、长连接与短连接
长连接: 指在一个TCP连接上可以连续发送多个数据包,
& & & & 在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接;
& & & & 一般需要自己做在线维持。&
短连接: 指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;
& & & & 一般银行都使用短连接。&
& & & & 它的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段&
比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。&
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
长连接与短连接的操作过程&
通常的短连接操作步骤是:&
& 连接→数据传输→关闭连接;
而长连接通常就是:&
& 连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;&
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,
短连接在没有数据传输时直接关闭就行了
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。
每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,
所以每个操作完后都不断开,下次次处理时直接发送数据包就OK了,不用建立TCP连接。
例如:数据库的连接用长连接,&
如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
二、发送接收方式
报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:&
(1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收&
(2)异步单工:接收和发送是用两个不同的程序来完成。&
报文发送和接收是同步进行,既报文发送后等待接收返回报文。&
同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,
超过该时间发送方不再等待读返回报文,直接通知超时返回。
在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。
读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。
三. 单工、半双工和全双工
根据通信双方的分工和信号传输方向可将通信分为三种方式:
在计算机网络中主要采用双工方式,其中:
局域网采用半双工方式,
城域网和广域网采用全双年方式。 &&
1. 单工(Simplex)方式:
通信双方设备中发送器与接收器分工明确,只能在由发送器向接收器的单一固定方向上传送数据。
采用单工通信的典型发送设备如早期计算机的读卡器,典型的接收设备如打印机。 &&
2. 半双工(Half Duplex)方式:
通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。
例如,步话机是半双工设备,因为在一个时刻只能有一方说话。 &&
3. 全双工(Full Duplex)方式:
通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。
例如,电话是全双工设备,因为双方可同时说话。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,
而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。
所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定。
四、一个最简单的长连接与心跳保持的示例程序
&******************************************************************************
&* \Author
&******************************************************************************
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define MAXBUF 1024
int main(int argc, char **argv)
& int sockfd,
& struct sockaddr_
& char buffer[MAXBUF];
& char heartbeat[20] = "hello server";
& int retval, maxfd = -1;
& if (argc != 3)
& & printf("error! the right format should be : \
& & & & & \n\t\t%s IP port\n\t eg:\t%s127.0.0.1 80\n",
& & & & & argv[0], argv[0]);
& & exit(0);
& if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
& & perror("Socket");
& & exit(errno);
& bzero(&dest, sizeof(dest));
& dest.sin_family = AF_INET;
& dest.sin_port = htons(atoi(argv[2]));
& memset(&(dest.sin_zero), 0, 8);
& if (inet_aton(argv[1], (struct in_addr*)&dest.sin_addr.s_addr) == 0)
& & perror(argv[1]);
& & exit(errno);
& if (connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0)
& & perror("Connect");
& & exit(errno);
& printf("\nReady to start chatting.\n\
& & & & Direct input messages and \n\
& & & & enter to send messages to the server\n");
& while (1)
& & FD_ZERO(&rfds);
& & FD_SET(0, &rfds);
& & maxfd = 0;
& & FD_SET(sockfd, &rfds);
& & if (sockfd > maxfd)
& & & maxfd =
& & tv.tv_sec = 2;
& & tv.tv_usec = 0;
& & retval = select(maxfd+1, &rfds, NULL, NULL, &tv);
& & if (retval == -1)
& & & printf("Will exit and the select is error! %s", strerror(errno));
& & else if (retval == 0)
& & & //printf("No message comes, no buttons, continue to wait ...\n");
& & & len = send(sockfd, heartbeat, strlen(heartbeat), 0);
& & & if (len < 0)
& & & & printf("Message '%s' failed to send ! \
& & & & & & & The error code is %d, error message '%s'\n",
& & & & & & & heartbeat, errno, strerror(errno));
& & & else
& & & & printf("News: %s \t send, sent a total of %d bytes!\n",
& & & & & & & heartbeat, len);
& & & if (FD_ISSET(sockfd, &rfds))
& & & & bzero(buffer, MAXBUF+1);
& & & & len = recv(sockfd, buffer, MAXBUF, 0);
& & & & if (len > 0)
& & & & & printf("Successfully received the message: '%s',%d bytes of data\n",
& & & & & & & & & buffer, len);
& & & & else
& & & & & if (len < 0)
& & & & & & & printf("Failed to receive the message! \
& & & & & & & & & & The error code is %d, error message is '%s'\n",
& & & & & & & & & & errno, strerror(errno));
& & & & & else
& & & & & & & printf("Chat to terminate!\n");
& & & if (FD_ISSET(0, &rfds))
& & & & bzero(buffer, MAXBUF+1);
& & & & fgets(buffer, MAXBUF, stdin);
& & & & if (!strncasecmp(buffer, "quit", 4))
& & & & & printf("Own request to terminate the chat!\n");
& & & & len = send(sockfd, buffer, strlen(buffer)-1, 0);
& & & & if (len < 0)
& & & & & printf("Message '%s' failed to send ! \
& & & & & & & & The error code is %d, error message '%s'\n",
& & & & & & & & buffer, errno, strerror(errno));
& & & & else
& & & & & printf("News: %s \t send, sent a total of %d bytes!\n",
& & & & & & & & buffer, len);
& close(sockfd);
& return 0;
第二卦:《坤卦》&
坤:元,亨,利牝马之贞。君子有攸往,先迷,后得主,利。西南得朋,东北丧朋。安贞吉。
【白话】《坤卦》象征地:元始,亨通,如果像雌马那样柔顺,则是吉利的。
君子从事某项事业,虽然开始时不知所从,但结果会是有利的。如往西南方,则会得到朋友的帮助。
如往东南方,则会失去朋友的帮助。如果保持现状,也是吉利的。
《象》曰:地势坤,君子以厚德载物。
【白话】《象辞》说:坤象征大地,君子应效法大地,胸怀宽广,包容万物。
阅读(74680) | 评论(0) | 转发(9) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。请问Websocket断线重连怎么实现的? - Pomelo Club
请问Websocket断线重连怎么实现的?
try catch无法捕获
监听 close 事件
谢谢回复,我的代码是在onclose中 try catch ws.on(&close&,function(event){try(重新new websocket )catch(e){}};请明示

我要回帖

更多关于 stomp websocket 断线 的文章

 

随机推荐