android利用websocket协议与服务器通信

最近做一个项目,需求中需要服务器主动推送消息到客户端。这样的话一般的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);
 } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android使用WebSocket实现多人游戏
  • SpringBoot webSocket实现发送广播、点对点消息和Android接收
  • Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)
  • android基于socket的局域网内服务器与客户端加密通信
  • Android实现蓝牙客户端与服务器端通信示例
  • Android使用http协议与服务器通信的实例
  • Android编程之客户端通过socket与服务器通信的方法
  • python服务器与android客户端socket通信实例
(0)

相关推荐

  • Android使用http协议与服务器通信的实例

    网上介绍Android上http通信的文章很多,不过大部分只给出了实现代码的片段,一些注意事项和如何设计一个合理的类用来处理所有的http请求以及返回结果,一般都不会提及.因此,自己对此做了些总结,给出了我的一个解决方案. 首先,需要明确一下http通信流程,Android目前提供两种http通信方式,HttpURLConnection和HttpClient,HttpURLConnection多用于发送或接收流式数据,因此比较适合上传/下载文件,HttpClient相对来讲更大更全能,但是速度相

  • android基于socket的局域网内服务器与客户端加密通信

    实现了基本的socket通信(即两台设备,一台用作服务器,一台用作客户端),服务器进行监听,客户端发送加密数据到服务器,服务器进行解密得到明文. 注意:本项目中使用了ButterKnife及EventBus作为辅助工具,通信建立时默认网络正常(未做局域网网络环境检测),加密方式为AES加密 1.效果图: (1)客户端 (2)服务器端 2.界面布局部分 (1)服务器端布局 function_socket_server.xml <?xml version="1.0" encoding

  • Android实现蓝牙客户端与服务器端通信示例

    一.首先说明:蓝牙通信必须用手机测试,因为avd里没有相关的硬件,会报错! 好了,看看最后的效果图:   二.概述: 1.判断是否支持Bluetooth BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothAdapter == null) { //the device doesn't support bluetooth } else { //the device support

  • python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: 复制代码 代码如下: #server.py  import socket  def getipaddrs(hostname):#只是为了显示IP,仅仅测试一下      result = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM)      re

  • Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考:如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? 今天的重点是讲如何在Android中脱离WebView使用WebSocket,而不是在Web浏览器

  • Android使用WebSocket实现多人游戏

    WebSocket 是 HTML5 一种新的协议.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是: WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样: WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能

  • SpringBoot webSocket实现发送广播、点对点消息和Android接收

    1.SpringBoot webSocket SpringBoot 使用的websocket 协议,不是标准的websocket协议,使用的是名称叫做STOMP的协议. 1.1 STOMP协议说明 STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议. 它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消

  • Android编程之客户端通过socket与服务器通信的方法

    本文实例讲述了Android编程之客户端通过socket与服务器通信的方法.分享给大家供大家参考,具体如下: 下面是一个demo,Android客户端通过socket与服务器通信. 由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别.只是UI代码不一样. Android客户端通过socket与服务器通信分为下面5步: (1)通过IP地址和端口实例化Socket,请求连接服务器: 复制代码 代码如下: socket = new

  • android利用websocket协议与服务器通信

    最近做一个项目,需求中需要服务器主动推送消息到客户端.这样的话一般的http连接就不能使用了.博主问了个朋友,向我推荐websocket协议,特此测试了一下,发现效果很好. android本身没有websocket的库,需要自己下载 ,下载地址. 客户端代码: 界面布局自己写,很简单的两个button package com.example.test; import com.example.test.R; import android.app.Activity; import android.o

  • Django使用HTTP协议向服务器传参方式小结

    目录 1.查询字符串数据(query string): 2. 提取请求体数据 2.1 表单类型请求体数据(Form Data) 2.2 非表单类型请求体数据(Non-Form Data):JSON 3. URL路径参数:提取URL路径中的特定部分数据 3.1 path()提取路径参数 3.2 re_path()提取路径参数 3.3 path()和re_path()如何选择? 4. 请求头 5. 其他常用HttpRequest对象属性 用户发送请求时携带的参数后端需要使用,而不同的发送参数的方式对

  • Java利用TCP协议实现客户端与服务器通信(附通信源码)

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章"盘点那些进行网络编程必须要知道的基础知识",那么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发. TCP协议概念 先来了解一下TCP协议的基本概念. 我们知道TCP是可靠

  • C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的相关概念问题,在这里就不再做具体的介绍了,有兴趣的可以自行百度. 下面我们介绍一款WebSocket组件websocket-sharp的相关内容. 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端,websocket-sha

  • 详解Android 基于TCP和UDP协议的Socket通信

    本来想讲一下基础的网络通信方面的知识点,发现太枯燥乏味了,不过笔试中也经常会问到这方面的问题,所以关于通信方面的知识点,小编会放到面试中去,因为实战中也就面试会用到这方面知识点 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据. 而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数

  • Android MQTT与WebSocket协议详细讲解

    目录 MQTT WebSocket 总结 MQTT MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用 有如下特点: 开放消息协议,简单易实现: 发布订阅模式,一对多消息发布: 基于TCP/IP网络连接,提供有序,无损,双向连接: 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量: 消息QoS支持,可靠传输保证. 添加依赖 maven { url "https://repo.eclipse.org/conten

  • Android利用Andserver搭建服务器的详细教程

    效果 需求   在手机上有一个功能,但是需要使用电脑控制什么时候开始这个功能,然后上网搜索,找到了AndServer可以满足要求,我只是实现了简单的功能,如果感兴趣的话,可以深入的研究一下. 地址如下:https://github.com/yanzhenjie/AndServer 1.步骤引入 implementation 'com.yanzhenjie:andserver:1.0.2' 2.申请权限 <uses-permission android:name="android.permi

  • Android开发MQTT协议的模型及通信浅析

    目录 前言 什么是MQTT协议 MQTT协议的模型 开发MQTT通信 1. 处理客户端和服务端 (1)服务端开发 (2)客户端开发 2. 客户端开发 Paho的mqtt的BUG 总结 前言 为什么要讲MQTT协议?因为现在越来越多的领域会使用到这个协议,无论是做M2M,还是做Iot,或是想实现推送功能,MQTT都是一个不错的选择. 什么是MQTT协议 MQTT协议又称为消息队列要测传输协议,他是一种基于发布/订阅范式的消息协议,并且它是一种基于TCP/IP协议族的应用层协议. 可以看出的它的特点

随机推荐