Android使用websocket采坑记录

本文介绍如何在Android客户端与服务器间使用WebSocket协议进行实时通信。详细展示了Android客户端的代码实现,包括连接、发送与接收消息的过程。同时,提供了服务器端基于Jetty的WebSocket实现代码,用于响应客户端的请求并推送消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:https://blog.youkuaiyun.com/suixiang888/article/details/9959993

开发总结:

问题:因为刚开始Android端的websockets和后台的类不对应出现一些小问题。

得出结论:后面开发Android和后台要用对应的类来开发。(websockets协议Android有对应的类,后台使用与Android对应的类才行)、

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值