android利用websocket協(xié)議與服務(wù)器通信
最近做一個(gè)項(xiàng)目,需求中需要服務(wù)器主動(dòng)推送消息到客戶端。這樣的話一般的http連接就不能使用了。博主問了個(gè)朋友,向我推薦websocket協(xié)議,特此測試了一下,發(fā)現(xiàn)效果很好。
android本身沒有websocket的庫,需要自己下載 ,下載地址。
客戶端代碼:
界面布局自己寫,很簡單的兩個(gè)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往服務(wù)器發(fā)數(shù)據(jù)");
break;
case R.id.bt1 :
connect();
break;
default :
break;
}
}
private void showtext(String msg) {
Toast.makeText(this, msg, 0).show();
}
}
下面是服務(wù)器代碼:
用的是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("這個(gè)用戶已經(jīng)連接了");
}
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("發(fā)送的數(shù)據(jù)" + 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);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)3D標(biāo)簽云簡單效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)3D標(biāo)簽云簡單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android LayoutInflater加載布局詳解及實(shí)例代碼
這篇文章主要介紹了Android LayoutInflater加載布局詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
實(shí)現(xiàn)activity管理器一次退出所有activity
退出所有Activity網(wǎng)上有很多很多種說法,推薦的一種方法是自定義一個(gè)Activity管理器,來管理所有已打開的Activity,要退出的時(shí)候再通過這個(gè)管理器來退出所有Activity,下面是一個(gè)簡單的Activity管理器代碼2014-01-01
Android 廣播監(jiān)聽網(wǎng)絡(luò)狀態(tài)詳解及實(shí)例代碼
這篇文章主要介紹了Android 廣播監(jiān)聽網(wǎng)絡(luò)狀態(tài)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
android開發(fā)基礎(chǔ)教程—打電話發(fā)短信
打電話發(fā)短信的功能已經(jīng)離不開我們的生活了,記下來介紹打電話發(fā)短信的具體實(shí)現(xiàn)代碼,感興趣的朋友可以了解下2013-01-01
Flutter實(shí)現(xiàn)漸變弧形進(jìn)度條的示例詳解
在Flutter開發(fā)中,構(gòu)建一個(gè)具有視覺吸引力的、反映進(jìn)度的圓形弧形進(jìn)度條是一個(gè)常見需求,本文將詳細(xì)介紹如何使用Flutter和Dart語言實(shí)現(xiàn)這一功能,需要的可以參考下2023-12-12
android中實(shí)現(xiàn)手機(jī)號碼的校驗(yàn)的示例代碼
本篇文章主要介紹了android中實(shí)現(xiàn)手機(jī)號碼的校驗(yàn)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09

