最近做一个项目,需求中需要服务器主动推送消息到客户端。这样的话一般的http连接就不能使用了。博主问了个朋友,向我推荐websocket协议,特此测试了一下,发现效果很好。
android本身没有websocket的库,需要自己下载 ,下载地址。
客户端代码:
界面布局自己写,很简单的两个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; @Override protected 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() { @Override public void onBinaryMessage(byte[] payload) { System.out.println("onBinaryMessage size=" + payload.length); } @Override public void onClose(int code, String reason) { System.out.println("onClose reason=" + reason); } @Override public void onOpen() { System.out.println("onOpen"); showtext("连接成功"); // wsc.sendTextMessage("Hello!"); // wsc.disconnect(); } @Override public void onRawTextMessage(byte[] payload) { System.out.println("onRawTextMessage size=" + payload.length); } @Override public void onTextMessage(String payload) { System.out.println("onTextMessage" + payload); showtext(payload); } }); } catch (WebSocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onClick(View v) { // TODO Auto-generated method stub int 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<MyWebSocket> list = new ArrayList<MyWebSocket>(); 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 stub System.out.println("onOpen 断开连接了。。。。。。。。" + arg1 + " " + arg0); list.remove(this); } public void onOpen(Connection arg0) { // TODO Auto-generated method stub System.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 block e.printStackTrace(); } } private Connection getConn() { return this.conn; } } public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) { // TODO Auto-generated method stub String name = ""; name = arg0.getParameter("username"); System.out.println(name + "is connected"); return new MyWebSocket(name); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub super.service(request, response); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
Web主要围绕HTTP的请求/响应范例构建。客户端加载网页,然后在用户点击下一页之前没有任何操作。大约在2005年,AJAX开始让网络感觉更有活力。仍然,所有HTTP通信都由客户端引导,这需要用户交互或定期轮询以从服务器加载新数据。 使服务器能够在知道新数据可用的瞬间将数据发送到客户端的技术已存在很长时间了。它们的名称如“Push”或“Comet”。 将套接字引入Web Websocket规范定义
本服务条款(以下简称“本协议”)由北京百度网讯科技有限公司(以下简称“百度”)与您(以下简称“您”或“用户”)订立,用于规范您对百度统计(以下简称“本服务”)的使用。只要您点击 “确定”按钮、完成注册程序或开通、使用本服务,即代表您已理解并同意本协议,特别是以黑体字标示出的关于百度统计及您重大权益的条款均以知晓、理解并接受,同意将其作为确定双方权利义务的依据。如果您不同意本协议,请您立即停止使用本
京东小程序开放平台开发者服务协议 【请认真阅读并理解以下内容,其中以加粗方式显著标识的文字,请着重阅读、慎重考虑】 前言 1、本协议由拟在京东小程序开放平台(以下或简称“京东小程序平台”或“小程序平台”)开发京东小程序(以下或简称“小程序”)的京东小程序开发者(以下简称“开发者”,“乙方”或“您”)与京东小程序开放平台运营方(以下或简称“京东”或“甲方”)共同缔结,具有合同效力。 2、本协议由协议
1.1. Rokid 开发者社区服务协议 1.1.1. 一、定义 1.2. 二、协议构成 1.3. 三、特别提示 1.3.1. 四、甲方服务内容 1.3.2. 五、开发者承诺和服务使用规范 1.3.3. 六、数据及隐私 1.3.4. 七、服务费用及开发者收费 1.3.5. 八、违约责任 1.3.6. 九、协议的解除和转让 1.3.7. 十、服务终止后的处理 1.3.8. 十一、责任限制和免责 1.
为了营造规范、有序、安全的开发者社区环境,并利用先进的互联网技术给用户带来便利或更好的体验,芋头科技(杭州)有限公司(下文简称“甲方”)与您(以下简称“开发者”或“乙方”)就开发者社区的使用等相关事项,在杭州市余杭区签订本协议。 特别提示: 开发者通过网络页面点击确认或以其他方式选择接受本协议或使用开发者社区的服务,即表示开发者同意并接受本协议条款,请开发者仔细阅读本协议的全部内容(特别是以粗体标
为了营造规范、有序、安全的开发者社区环境,并利用先进的互联网技术给用户带来便利或更好的体验,芋头科技(杭州)有限公司(下文简称“甲方”)与您(以下简称“开发者”或“乙方”)就开发者社区的使用等相关事项,在杭州市余杭区签订本协议。 特别提示: 开发者通过网络页面点击确认或以其他方式选择接受本协议或使用开发者社区的服务,即表示开发者同意并接受本协议条款,请开发者仔细阅读本协议的全部内容(特别是以粗体标