最近做一个项目,需求中需要服务器主动推送消息到客户端。这样的话一般的http连接就不能使用了。博主问了个朋友,向我推荐websocket协议,特此测试了一下,发现效果很好。

android本身没有websocket的库,需要自己下载 http://autobahn.ws/android/downloads

客户端代码。。。。

界面布局自己写,很简单的两个button

package com.example.test;import com.example.test.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import de.tavendo.autobahn.WebSocketConnection;import de.tavendo.autobahn.WebSocketConnectionHandler;import de.tavendo.autobahn.WebSocketException;public class MainActivity extends Activity implements OnClickListener {private Button bt;private EditText ed_name;private EditText ed_text;private Button bt1;WebSocketConnection wsc;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt = (Button) findViewById(R.id.bt);ed_name = (EditText) findViewById(R.id.ed_name);ed_text = (EditText) findViewById(R.id.ed_text);bt1 = (Button) findViewById(R.id.bt1);bt.setOnClickListener(this);bt1.setOnClickListener(this);wsc = new WebSocketConnection();}private void connect() {System.out.println("开始连接websocket///");try {wsc.connect("ws://192.168.1.245:8080/DriveServer/mainservlet",new WebSocketConnectionHandler() {@Overridepublic void onBinaryMessage(byte[] payload) {System.out.println("onBinaryMessage size="+ payload.length);}@Overridepublic void onClose(int code, String reason) {System.out.println("onClose reason=" + reason);}@Overridepublic void onOpen() {System.out.println("onOpen");showtext("连接成功");// wsc.sendTextMessage("Hello!");// wsc.disconnect();}@Overridepublic void onRawTextMessage(byte[] payload) {System.out.println("onRawTextMessage size="+ payload.length);}@Overridepublic void onTextMessage(String payload) {System.out.println("onTextMessage" + payload);showtext(payload);}});} catch (WebSocketException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubint id = v.getId();switch (id) {case R.id.bt :wsc.sendTextMessage("我是客户端,我通过ws往服务器发数据");break;case R.id.bt1 :connect();break;default :break;}}private void showtext(String msg) {Toast.makeText(this, msg, 0).show();}}


下面是服务器代码:

用的是jetty7自带的websocket库

package com.websocket;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.eclipse.jetty.websocket.WebSocket;import org.eclipse.jetty.websocket.WebSocket.OnTextMessage;import org.eclipse.jetty.websocket.WebSocketServlet;public class ChatWebSocketServlet extends WebSocketServlet {private static final long serialVersionUID = 911879078000755859L;private List list = new ArrayList();class MyWebSocket implements OnTextMessage {private String userName = "匿名用户";public MyWebSocket(String userName) {if (userName != null && userName.length() > 0) {this.userName = userName;}}private Connection conn;public void onClose(int arg0, String arg1) {// TODO Auto-generated method stubSystem.out.println("onOpen 断开连接了。。。。。。。。" + arg1 + "  " + arg0);list.remove(this);}public void onOpen(Connection arg0) {// TODO Auto-generated method stubSystem.out.println("onOpen 连接了。。。。。。。。。。。。" + arg0.getMaxIdleTime());this.conn = arg0;if (!list.contains(arg0)) {list.add(this);} else {System.out.println("这个用户已经连接了");}System.out.println(".." + list.size());}public void onMessage(String arg0) {String toname = arg0.substring(0, 3);System.out.println("toname-->" + toname);try {list.get(0).getConn().sendMessage(arg0.substring(3));System.out.println("发送的数据" + arg0.substring(3));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private Connection getConn() {return this.conn;}}public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {// TODO Auto-generated method stubString name = "";name = arg0.getParameter("username");System.out.println(name + "is connected");return new MyWebSocket(name);}@Overrideprotected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(request, response);}}

欢迎交流,转载请注明出处。

更多相关文章

  1. Android 动态加载APK--代码安装、获取资源及Intent调用已安装apk
  2. Android 利用JNI调用Android Java代码函数
  3. Android浮动窗口实现原理及代码实例
  4. ubuntu下载android源代码
  5. Android 权限控制代码分析

随机推荐

  1. MySQL可视化软件Work Bench导出导入数据
  2. mysql恢复报ERROR 2006 (HY000) at line
  3. Linux Centos 下使用yum 命令安装mysql
  4. 从具有外部约束的多个表中删除
  5. Mysql异常_01_ 誓死登进mysql_Can't
  6. qt连接mysql运行时出现QSqlQuery::exec:d
  7. 【Qt】Qt5.12连接MySQl5.7(亲自测试成功)
  8. MySQL DELETE语句和TRUNCATE TABLE语句的
  9. 计算mysql中每天的发生次数
  10. 为获得快速结果,我的查询有什么好的索引?