Android使用websocket

使用library: https://github.com/tavendo/AutobahnAndroid

package com.fkapp.websocket;

import com.fkapp.websocket.R;

import de.tavendo.autobahn.WebSocketConnection;
import de.tavendo.autobahn.WebSocketException;
import de.tavendo.autobahn.WebSocketHandler;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
	private final String		TAG	= "MainActivity";
	public static String		wsUrl	= "ws://ip:port/chat"/* TODO: 运行时替换ip port */
	public WebSocketConnection	wsC	= new WebSocketConnection();

	public Handler handler = new Handler()
	{
		@Override
		public void handleMessage( Message msg )
		{
			super.handleMessage( msg );
			if ( msg.what == 0 )
			{
			}
		}
	};

	public void toastLog( String s )
	{
		Toast.makeText( this, s, Toast.LENGTH_SHORT ).show();
	}


	private void wsStart()
	{
		try {
			wsC.connect( wsUrl, new WebSocketHandler()
				     {
					     @Override
					     public void onOpen()
					     {
						     toastLog( "Status: Connected to " + wsUrl );
						     wsC.sendTextMessage( "Hello, world!" );
					     }

					     @Override
					     public void onTextMessage( String payload )
					     {
						     toastLog( "Got echo: " + payload );
					     }

					     @Override
					     public void onCloseint code, String reason )
					     {
						     toastLog( "Connection lost." );
					     }
				     } );
		} catch ( WebSocketException e ) {
			e.printStackTrace();
		}
	}


	@Override
	protected void onCreate( Bundle savedInstanceState )
	{
		super.onCreate( savedInstanceState );
		setContentView( R.layout.activity_main );

		wsStart();

		Button wsSend = (Button) findViewById( R.id.wsSend );
		wsSend.setOnClickListener( new View.OnClickListener()
					    {
						    @Override
						    public void onClick( View v )
						    {
							    wsC.sendTextMessage( "ooxx" );
						    }
					    } );
	}


	@Override
	protected void onDestroy()
	{
		super.onDestroy();
		if ( wsC.isConnected() )
		{
			wsC.disconnect();
		}
	}


	@Override
	public boolean onCreateOptionsMenu( Menu menu )
	{
		/* Inflate the menu; this adds items to the action bar if it is present. */
		getMenuInflater().inflate( R.menu.main, menu );
		return(true);
	}


	@Override
	public boolean onOptionsItemSelected( MenuItem item )
	{
		/*
		 * Handle action bar item clicks here. The action bar will
		 * automatically handle clicks on the Home/Up button, so long
		 * as you specify a parent activity in AndroidManifest.xml.
		 */
		int id = item.getItemId();
		if ( id == R.id.action_settings )
		{
			return(true);
		}
		return(super.onOptionsItemSelected( item ) );
	}
}

进行通信

https://github.com/gf0842wf/android-websocket-sample

<think>我们参考用户提供的引用资料,特别是引用[1][2][3][5]关于AndroidWebSocket的内容,来构建一个Android平台使用WebSocket的教程和示例代码。引用[1]提到WebSocketAndroid应用开发中用于实时通信,引用[2]提供了服务端和Android客户端的简单示例,引用[3]提到了一个工具类包含重连、心跳和消息队列,引用[5]提到了超时重连的处理。我们将分步骤介绍:1.添加依赖2.创建WebSocket工具类(包含连接、断开、发送消息、重连机制、心跳机制等)3.在Activity中使用该工具类注意:我们使用OkHttp库的WebSocket实现,因为OkHttp是Android常用的网络库,并且提供了WebSocket支持。步骤:1.在build.gradle中添加依赖2.创建WebSocket工具类,包含以下功能:-连接WebSocket-断开连接-发送消息-处理重连(当连接意外断开时)-心跳机制(定时发送Ping消息)-消息队列(在连接断开时缓存消息,连接成功后重新发送)3.在Activity中初始化WebSocket工具类,并处理生命周期(在onDestroy时释放资源)参考引用[3]和[5]的重连和心跳机制,以及引用[4]中关于连接池的处理(但客户端不需要连接池,所以我们主要关注单个连接的管理)。下面我们开始编写代码示例:</think>### Android WebSocket 使用教程与示例代码 WebSocketAndroid 中提供高效的实时双向通信能力,适用于聊天、实时数据更新等场景。以下是完整实现方案: --- #### 一、添加依赖 在 `build.gradle` 中添加 OkHttp WebSocket 依赖: ```gradle dependencies { implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' } ``` --- #### 二、WebSocket 工具类实现 创建 `WebSocketManager.java` 集成重连、心跳和消息队列机制[^3][^5]: ```java public class WebSocketManager { private static final String TAG = "WebSocketManager"; private static final long RECONNECT_DELAY = 5000; // 5秒重连间隔 private static final long HEARTBEAT_INTERVAL = 30000; // 30秒心跳间隔 private final OkHttpClient client; private WebSocket webSocket; private final Handler heartbeatHandler = new Handler(Looper.getMainLooper()); private final String wsUrl; private boolean isConnected = false; private final LinkedBlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(); public WebSocketManager(String url) { this.wsUrl = url; this.client = new OkHttpClient.Builder() .pingInterval(HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS) .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)) .build(); } // 连接WebSocket public void connect() { if (isConnected) return; Request request = new Request.Builder() .url(wsUrl) .build(); webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { isConnected = true; Log.i(TAG, "WebSocket连接成功"); // 发送队列中积压的消息 while (!messageQueue.isEmpty()) { sendMessage(messageQueue.poll()); } startHeartbeat(); } @Override public void onMessage(WebSocket webSocket, String text) { Log.d(TAG, "收到消息: " + text); // 处理业务消息(通过接口回调) } @Override public void onClosing(WebSocket webSocket, int code, String reason) { isConnected = false; Log.w(TAG, "连接关闭中: " + code + "/" + reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { isConnected = false; Log.e(TAG, "连接失败: " + t.getMessage()); scheduleReconnect(); // 触发重连 } }); } // 发送消息(自动入队) public void sendMessage(String message) { if (isConnected) { webSocket.send(message); } else { messageQueue.offer(message); // 加入消息队列 Log.w(TAG, "消息已加入队列(等待连接恢复)"); } } // 心跳机制 private void startHeartbeat() { heartbeatHandler.postDelayed(new Runnable() { @Override public void run() { if (isConnected) { webSocket.send("{\"type\":\"ping\"}"); // 发送心跳包 heartbeatHandler.postDelayed(this, HEARTBEAT_INTERVAL); } } }, HEARTBEAT_INTERVAL); } // 重连机制 private void scheduleReconnect() { heartbeatHandler.postDelayed(() -> { Log.i(TAG, "尝试重新连接..."); connect(); }, RECONNECT_DELAY); } // 关闭连接 public void disconnect() { if (webSocket != null) { webSocket.close(1000, "正常关闭"); heartbeatHandler.removeCallbacksAndMessages(null); isConnected = false; } } } ``` --- #### 三、在 Activity 中使用 `MainActivity.java` 实现生命周期绑定[^3]: ```java public class MainActivity extends AppCompatActivity { private WebSocketManager webSocketManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化WebSocket(示例地址) webSocketManager = new WebSocketManager("wss://your-websocket-server.com/ws"); Button connectBtn = findViewById(R.id.connectBtn); Button sendBtn = findViewById(R.id.sendBtn); EditText messageInput = findViewById(R.id.messageInput); connectBtn.setOnClickListener(v -> webSocketManager.connect()); sendBtn.setOnClickListener(v -> { String msg = messageInput.getText().toString(); if (!msg.isEmpty()) { webSocketManager.sendMessage(msg); messageInput.setText(""); } }); } @Override protected void onDestroy() { super.onDestroy(); webSocketManager.disconnect(); // 释放资源 } } ``` --- #### 四、布局文件 `activity_main.xml` 基础UI: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/connectBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="连接WebSocket"/> <EditText android:id="@+id/messageInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:hint="输入消息"/> <Button android:id="@+id/sendBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="发送消息"/> <TextView android:id="@+id/statusView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"/> </LinearLayout> ``` --- #### 五、关键机制说明 1. **重连机制** - 连接失败后自动延时重连(`scheduleReconnect()`) - 网络恢复时可自动重建连接[^5] 2. **心跳保活** - 定时发送 Ping 帧保持连接活性 - 服务端无响应时自动触发重连 3. **消息队列** - 未连接时消息自动缓存(`LinkedBlockingQueue`) - 连接恢复后按顺序发送积压消息[^3] 4. **生命周期绑定** - `onDestroy()` 中主动关闭连接 - 避免内存泄漏和资源浪费 --- #### 六、服务端配置建议 Android 客户端需配合 WebSocket 服务端使用: ```java // Spring Boot 服务端示例(引用[2]) @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/ws") .addInterceptors(new HandshakeInterceptor()); } } ``` > **注意**:生产环境务必使用 `wss://` 安全连接,并在 AndroidManifest.xml 添加网络权限: > ```xml > <uses-permission android:name="android.permission.INTERNET"/> > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值