websocket实现android A 通过服务器实时控制android B
来源:互联网 发布:php防止sql注入代码 编辑:程序博客网 时间:2024/04/26 04:07
对于WebSocket协议的优缺点,相信大家一定已经很了解了,那么这里就
客户端A通过websocket协议与服务器建立一个长连接,同时android客户
端B与服务器也通过websocket建立一个长连接,从而,android A可以实时
的控制android B,解决掉传统方法的延迟问题。
服务器
ide:intellij idea+Tomcat7.0.52
jar包:catalina+tomcat-coyote
package com.jucheng.mvc.controller;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WsOutbound;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* Android B 与服务器建立长连接 websocket
* Created by Gang.Liu on 16/1/18.
*/
@WebServlet(name = “TvServlet”, urlPatterns = “/tvservlet”)
public class TvWSServlet extends TeaWSServlet {
//public static WsOutbound myoutbound11 = null;private static final long serialVersionUID = 1L;private static List<TvMessageInbound> myMessageInbounds = new ArrayList<TvMessageInbound>();@Overrideprotected StreamInbound createWebSocketInbound(String s, HttpServletRequest httpServletRequest) { return new TvMessageInbound();}public class TvMessageInbound extends MessageInbound { WsOutbound myoutbound; /** * 打开连接 * WsOutbound 输出流 负责输出结果 */ @Override public void onOpen(WsOutbound outbound) { try { System.out.println("TV Client Open Client."); this.myoutbound = outbound; //myoutbound11 = this.myoutbound; myMessageInbounds.add(this); outbound.writeTextMessage(CharBuffer.wrap("Hello TV,connected!")); } catch (IOException e) { e.printStackTrace(); } } /** * 与客户端断开连接 * * @param status */ @Override public void onClose(int status) { System.out.println("TV Client Close Clients."); myMessageInbounds.remove(this); } /** * 接收消息 */ @Override public void onTextMessage(CharBuffer cb) throws IOException { //接收到客户端的信息 System.out.println("Accept Message From TV : " + cb);
// for (TvMessageInbound myMessageInbound : myMessageInbounds) {
// CharBuffer buffer = CharBuffer.wrap(cb);
// //将接受到的信息存放在 myMessageInbound- 集合中
// myMessageInbound.myoutbound.writeTextMessage(buffer);
// myMessageInbound.myoutbound.flush();
// }
}
@Override public void onBinaryMessage(ByteBuffer bb) throws IOException { } /** * 推送消息 * * @param event */ public void sendMessage(String event) { //String eventStr = JSON.toJSONString(event); try { //推送给TV跳转消息 for (TvMessageInbound myMessageInbound : myMessageInbounds) { myMessageInbound.getWsOutbound().writeTextMessage(CharBuffer.wrap(event)); //myMessageInbound.getWsOutbound().flush(); } //myoutbound11.writeTextMessage(CharBuffer.wrap(event)); } catch (IOException e) { e.printStackTrace(); } }}
}
package com.jucheng.mvc.controller;
import com.alibaba.fastjson.JSON;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* android A 与服务器 建立 websocket 连接
* Created by Gang.Liu on 16/1/18.
*/
@WebServlet(name = “WebsocketServlet”, urlPatterns = “/websocket”)
public class TeaWSServlet extends WebSocketServlet {
private static final long serialVersionUID = 1L;private static List<MyMessageInbound> myMessageInbounds = new ArrayList<MyMessageInbound>();@Overrideprotected StreamInbound createWebSocketInbound(String s, HttpServletRequest httpServletRequest) { return new MyMessageInbound();}private class MyMessageInbound extends MessageInbound { WsOutbound myoutbound; /** * 打开连接 */ @Override public void onOpen(WsOutbound outbound) { try { System.out.println("Teacher Open Client."); this.myoutbound = outbound; myMessageInbounds.add(this); //通知客户端已连接 outbound.writeTextMessage(CharBuffer.wrap("Hello,Teacher connected!")); outbound.flush(); } catch (IOException e) { e.printStackTrace(); } } /** * 与客户端断开连接 * * @param status */ @Override public void onClose(int status) { System.out.println("Teacher Close Clients."); myMessageInbounds.remove(this); } /** * 接收消息 */ @Override public void onTextMessage(CharBuffer cb) throws IOException { System.out.println("Accept Message From Teacher : " + cb); //接收到跳转消息后 String flag = cb.toString(); //调用TvWSServlet内部类的方法 发送跳转消息到TV TvWSServlet tvServlet = new TvWSServlet(); TvWSServlet.TvMessageInbound in = tvServlet.new TvMessageInbound(); in.sendMessage(flag); //遍历myMessageInbounds对象集合 for (MyMessageInbound myMessageInbound : myMessageInbounds) { CharBuffer buffer = CharBuffer.wrap(cb); //将接受到的信息存放在 myMessageInbound- 集合中
// myMessageInbound.myoutbound.writeTextMessage(buffer);
// myMessageInbound.myoutbound.flush();
}
}
@Override public void onBinaryMessage(ByteBuffer bb) throws IOException { } /** * 推送消息 * * @param event */ public void sendMessage(String event) { String eventStr = JSON.toJSONString(event); try { this.getWsOutbound().writeTextMessage(CharBuffer.wrap(eventStr)); } catch (IOException e) { e.printStackTrace(); } }}
}
android A 客户端:
public class MainActivity extends Activity {
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}//接收到服务器的消息 用Toast显示出来Handler handler=new Handler(){ public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, msg.getData().getString("info"), Toast.LENGTH_SHORT).show(); };};@Overridepublic boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true;}public void onSend(View v){ URI uri=null; try { //与服务器建立链接 uri=new URI("ws://192.168.0.107:8080/websocket"); } catch (Exception e) { e.printStackTrace(); } WebSocketWorker webSocketWorker=new WebSocketWorker(uri, new Draft_17()); try { webSocketWorker.connectBlocking();//此处如果用 webSocketWorker.connect(); } catch (Exception e) { e.printStackTrace(); } //向服务器发送内容为 text webSocketWorker.send("text");}//调用菜单选项@Overridepublic boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub int id=item.getItemId(); //点击设置按钮 if(id==R.id.action_settings){ URI uri=null; try { //与服务器建立链接 uri=new URI("ws://192.168.0.107:8080/websocket"); } catch (Exception e) { e.printStackTrace(); } WebSocketWorker webSocketWorker=new WebSocketWorker(uri, new Draft_17()); try { webSocketWorker.connectBlocking();//此处如果用 webSocketWorker.connect(); } catch (Exception e) { e.printStackTrace(); } //向服务器发送内容为 text webSocketWorker.send("text"); return true; } return super.onOptionsItemSelected(item);}public class WebSocketWorker extends WebSocketClient{ public WebSocketWorker(URI serverUri, Draft draft) { super(serverUri, draft); // TODO Auto-generated constructor stub } @Override public void onClose(int arg0, String arg1, boolean arg2) { // TODO Auto-generated method stub } @Override public void onError(Exception arg0) { // TODO Auto-generated method stub } /** * 接受到服务器的消息 然后利用handler */ @Override public void onMessage(String arg0) { // TODO Auto-generated method stub Bundle bundle=new Bundle(); bundle.putString("info", arg0); Message message=new Message(); message.setData(bundle); handler.sendMessage(message); } @Override public void onOpen(ServerHandshake arg0) { // TODO Auto-generated method stub }}
}
Android B客户端
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}private void init() { // TODO Auto-generated method stub URI uri=null; try { uri=new URI("ws://192.168.0.107:8080/tvservlet"); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } WebSocketWorker webSocketWorker=new WebSocketWorker(uri, new Draft_17()); try { webSocketWorker.connectBlocking();//此处如果用 webSocketWorker.connect(); } catch (Exception e) { e.printStackTrace(); }}//接收到服务器的消息 用Toast显示出来Handler handler=new Handler(){ public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, msg.getData().getString("info"), Toast.LENGTH_SHORT).show(); };};public class WebSocketWorker extends WebSocketClient{ public WebSocketWorker(URI serverUri, Draft draft) { super(serverUri, draft); // TODO Auto-generated constructor stub } @Override public void onClose(int arg0, String arg1, boolean arg2) { // TODO Auto-generated method stub } @Override public void onError(Exception arg0) { // TODO Auto-generated method stub } /** * 接受到服务器的消息 然后利用handler */ @Override public void onMessage(String arg0) { // TODO Auto-generated method stub Bundle bundle=new Bundle(); bundle.putString("info", arg0); Message message=new Message(); message.setData(bundle); handler.sendMessage(message); } @Override public void onOpen(ServerHandshake arg0) { // TODO Auto-generated method stub }}
}
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
}
}
“`
- websocket实现android A 通过服务器实时控制android B
- 数据存放在服务器B,通过访问服务器A实现下载服务器B数据
- android 通过WebSocket 实现长连接通讯消息
- 一个嵌入式web服务器项目,实现通过手机Android App实现对嵌入式设备的控制
- Android利用WebSocket进行实时通讯
- android使用websocket连接服务器
- 通过webSocket实现app运动数据在网页实时显示
- Android开发-通过USB实现ADB控制
- HTML5-WebSocket实现对服务器CPU实时监控
- NodeJS实现WebSocket前端和服务器通信,实时推送
- websocket 实现服务器日志实时反馈(linux 环境)
- Android中通过Handler实现进度条的实时更新
- spydroid-ipcamera 实现Android视频实时上传到服务器,服务器可以实时浏览
- websocket实现android消息推送
- websocket实现android消息推送
- Android WebSocket实现即时通讯/推送
- Android用Websocket实现聊天室
- Android连接webSocket客户端实现
- 数据结构与算法——二叉树的前序遍历,中序遍历,后序遍历
- Git---具体实例讲解Git用法以及提交PR
- Android之进程通信机制(下)(AIDL,Messenger,Socket)
- STL_算法_删除(remove、remove_if、remove_copy、remove_copy_if)
- listener-thread: err = -25572
- websocket实现android A 通过服务器实时控制android B
- 几种主流贴图压缩算法的实现原理
- JAVA学习笔记5--加载第三方jar包
- Bootstrap的图片轮播示例代码
- Structure and inference in annotated networks - note
- SSH中主键生成策略
- 协同过滤算法python实现简单入门详细注释
- 2946: [Poi2000]公共串 二分+hash
- find、grep、wc使用方法简单总结