对于所有基于服务端的c/s应用,传智播客的老师们认为:
如果多个客户端同时使用支持websocket的服务端,该如何连接?传智播客郑州校区为大家整理的连接方式如下:
传智播客为使用websocket提供的步骤如下:
1/创建一个websocket连接对象
mconnection=newwebsocketconnection();
2/创建监听器继承websocketconnectionhandler
publicclasswebsocketconnectlistenerextendswebsocketconnectionhandler{}
3/需要和服务器创建消息通道,用于和服务器的数据交互,可以发送和接收数据
publicvoidconnect(){
if(!isconnect()){
connectlistener=newwebsocketconnectlistener(context,mconnection,message,listener);
try{
mconnection.connect(websocket+path,connectlistener);
}catch(websocketexceptione){
e.printstacktrace();
}
}
}
4/与服务器发送消息前需要判断是否连接
publicbooleanisconnect(){
if(mconnection==null)returnfalse;
returnmconnection.isconnected();
}
5/客户端与服务器连接成功后测试发送消息接口
publicvoidsendtextmessage(stringsendtext){
if(mconnection==null){
return;
}
connect();
mconnection.sendtextmessage(sendtext);
}
6/由于是基于http协议。也可以作为普通的request请求使用
//连接建立成功
@override
publicvoidonopen(){
super.onopen();
logutils.d(%s,websocketconnectlistenerconnect);
connection.sendtextmessage(message);
}
//连接断开(一般情况下是由于网络断开,或者请求参数出错)
@override
publicvoidonclose(intcode,stringreason){
super.onclose(code,reason);
logutils.d(%s,websocketconnectlistenerlost);
if(this.listener!=null){
this.listener.onclose(code,reason);
}
}
//收到服务器消息时使用
@override
publicvoidontextmessage(stringpayload){
super.ontextmessage(payload);
logutils.d(%s,payload=+payload);
if(this.listener!=null){
this.listener.onsuccess(payload);
}
}
作为一个普通的请求方式,类似http请求方式。这里自定义协议对象,封装请求参数后进行请求
irequesttokenrequest=newtokenrequest(context,app.getinstance().getdeviceid(),newirequestlistener(){
@override
publicvoidonsuccess(stringpayload){
tokenresponseresponse=jsonutils.fromjson(payload,tokenresponse.class);
if(response.isrequestsuccssful()){
dbadapter.getinstance().addtoken(response.totoken());
app.getinstance().settoken(response.totoken());
settoken(response.totoken().gettoken());
request.request();
}else{
snackbarutils.show((activity)context,r.string.device_unauth);
}
}
@override
publicvoidonclose(intcode,stringreason){
}
});
tokenrequest.request();
这里tokenrequest对象仅仅是封装了协议请求参数。详细如下
@path(constants.path.tokenpath)
publicclasstokenrequestextendsirequest{
privatestringdeviceid;
publictokenrequest(contextcontext,stringdeviceid,irequestlistenerlistener){
super(context,listener);
this.deviceid=deviceid;
}
@override
protectedstringpraparemsg(){
return{+deviceid:+deviceid+};
}
}
以上是websocket协议完成了一次普通的http请求。它最大的优势是和服务端建立的双向通道,既可以由客户端发起请求,也可以由服务端发起请求。之前的自主研发消息推送基本上都是基于客户端轮询的方式,效率低并且浪费资源。此外,http请求的请求头很长,虽然和服务器建立连接时可能发送的是一个很少的数据,但这样也占用了服务器资源。然而,websocket在服务端和客户端之间的标头信息很小,而且还可以降低服务端的资源浪费。
所以,传智播客郑州校区也希望大家在工作中能够抓住相关问题的关键,了解编程技术的本质,那么在以后的工作中就会很轻松。另外,如果你想了解编程,想学习it,那么就来传智播客郑州校区吧!
相关新闻 2016-03-10 2016-10-12 2017-03-20 2017-05-15 2017-11-15