OkHttpClient webSocket实现心跳包

package com.example.appdemos;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

public class Main2Activity extends Activity implements View.OnClickListener{

    private Button btnStart;
    private TextView tvOutput;
    private WebSocket mSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        btnStart = (Button) findViewById(R.id.start);
        tvOutput = (TextView) findViewById(R.id.output);
        btnStart.setOnClickListener(this);
    }

    private void start() {
        OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
                .readTimeout(3, TimeUnit.SECONDS)//设置读取超时时间
                .writeTimeout(3, TimeUnit.SECONDS)//设置写的超时时间
                .connectTimeout(3, TimeUnit.SECONDS)//设置连接超时时间
                .build();

        Request request = new Request.Builder().url("ws://demos.kaazing.com/echo").build();
        EchoWebSocketListener socketListener = new EchoWebSocketListener();
        mOkHttpClient.newWebSocket(request, socketListener);
        mOkHttpClient.dispatcher().executorService().shutdown();
    }

    /**
     * @param v The view that was clicked.
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start://开始连接
                start();
                break;
        }
    }


    private final class EchoWebSocketListener extends WebSocketListener {

        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            super.onOpen(webSocket, response);
            mSocket = webSocket;
            String openid = "1";
            //连接成功后,发送登录信息
            String message = "{\"type\":\"login\",\"user_id\":\""+openid+"\"}";
            mSocket.send(message);
            output("连接成功!");

        }

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            super.onMessage(webSocket, bytes);
            output("receive bytes:" + bytes.hex());
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            super.onMessage(webSocket, text);
            output("receive text:" + text);
            //收到服务器端发送来的信息后,每隔25秒发送一次心跳包
            final String message = "{\"type\":\"heartbeat\",\"user_id\":\"heartbeat\"}";
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    mSocket.send(message);
                }
            },100);
        }

        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
            super.onClosed(webSocket, code, reason);
            output("closed:" + reason);
        }

        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            super.onClosing(webSocket, code, reason);
            output("closing:" + reason);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            super.onFailure(webSocket, t, response);
            output("failure:" + t.getMessage());
        }
    }

    private void output(final String text) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvOutput.setText(tvOutput.getText().toString() + "\n\n" + text);
            }
        });
    }
}

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <LinearLayout
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="vertical">


            <Button
                android:id="@+id/start"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="连接"
                android:textSize="17sp"/>

            <TextView
                android:id="@+id/output"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:textSize="16sp"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中使用 WebSocket 发送心跳包可以通过以下步骤实现: 1. 创建一个定时器,在一定的时间间隔内发送心跳包。 2. 在 WebSocket 连接建立时启动定时器。 3. 在定时器中发送一个特定的消息,表示心跳包。 下面是一个简单的示例代码,用于在 Java 中使用 WebSocket 发送心跳包: ```java import javax.websocket.*; import java.net.URI; import java.util.Timer; import java.util.TimerTask; @ClientEndpoint public class WebSocketClient { private Timer timer; @OnOpen public void onOpen(Session session) { System.out.println("WebSocket connected!"); // 启动定时器,每隔一段时间发送心跳包 timer = new Timer(); timer.schedule(new HeartbeatTask(session), 0, 5000); } @OnMessage public void onMessage(String message) { System.out.println("Received message: " + message); } @OnError public void onError(Throwable throwable) { System.out.println("Error: " + throwable.getMessage()); } @OnClose public void onClose() { System.out.println("WebSocket closed!"); } private static class HeartbeatTask extends TimerTask { private final Session session; public HeartbeatTask(Session session) { this.session = session; } @Override public void run() { try { System.out.println("Sending heartbeat message..."); session.getBasicRemote().sendText("heartbeat"); } catch (Exception ex) { ex.printStackTrace(); } } } public static void main(String[] args) throws Exception { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.connectToServer(WebSocketClient.class, new URI("ws://localhost:8080/ws")); } } ``` 在上面的示例代码中,我们创建了一个 `WebSocketClient` 类,用于与 WebSocket 服务器进行通信。在 `onOpen` 方法中,我们启动了一个定时器,并设置定时器每隔 5 秒发送一个心跳包。在 `HeartbeatTask` 类中,我们定义了发送心跳包的具体实现。最后,在 `main` 方法中,我们使用 `WebSocketContainer` 来连接到 WebSocket 服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值