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);
}
}
“`

0 0
原创粉丝点击