android - 使用 OkHttp 检查套接字是否连接或断开连接的更好方法?

标签 android sockets okhttp

我在 Android 上使用 OkHttp 通过套接字发送和接收消息。

创建套接字连接-

SocketListener listener = new SocketListener();

mOkHttpClient = new OkHttpClient.Builder()
    .readTimeout(0, TimeUnit.MILLISECONDS)
    .build();
Request request = new Request.Builder()
    .url(socketURL)
    .build();
mOkHttpClient.newWebSocket(request, listener);

这是用于监听所有网络套接字事件的 SocketListener 类 -

public final class SocketListener extends WebSocketListener { 
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
       // doing something
       isSocketConnected = true;
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
       // doing something
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
       // doing something
       isSocketConnected = true;
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
       isSocketConnected = false;
    }

}

有时套接字连接断开,如您所见,我在 SocketListener 类上使用 isSocketConnected 变量来跟踪“套接字是连接还是断开”。

有没有更好的方法来检查套接字是连接还是断开?

最佳答案

这是Tinder Scarlet使用Rx解决的方法

internal class OkHttpWebSocketEventObserver : WebSocketListener() {
    private val processor = PublishProcessor.create<WebSocket.Event>().toSerialized()

    fun observe(): Flowable<WebSocket.Event> = processor

    fun terminate() = processor.onComplete()

    override fun onOpen(webSocket: okhttp3.WebSocket, response: Response) =
        processor.onNext(WebSocket.Event.OnConnectionOpened(webSocket))

    override fun onMessage(webSocket: okhttp3.WebSocket, bytes: ByteString) =
        processor.onNext(WebSocket.Event.OnMessageReceived(Message.Bytes(bytes.toByteArray())))

    override fun onMessage(webSocket: okhttp3.WebSocket, text: String) =
        processor.onNext(WebSocket.Event.OnMessageReceived(Message.Text(text)))

    override fun onClosing(webSocket: okhttp3.WebSocket, code: Int, reason: String) =
        processor.onNext(WebSocket.Event.OnConnectionClosing(ShutdownReason(code, reason)))

    override fun onClosed(webSocket: okhttp3.WebSocket, code: Int, reason: String) =
        processor.onNext(WebSocket.Event.OnConnectionClosed(ShutdownReason(code, reason)))

    override fun onFailure(webSocket: okhttp3.WebSocket, t: Throwable, response: Response?) =
        processor.onNext(WebSocket.Event.OnConnectionFailed(t))
}

关于android - 使用 OkHttp 检查套接字是否连接或断开连接的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049022/

相关文章:

fragment 的 onCreate() 方法中的 Android 应用程序运行时错误

C Socket 程序示例 - 绑定(bind)错误 : Already in use

java - 请求和响应互相阻塞

react-native - React Native项目中将okhttp升级到3.14.x

android - Http请求拦截未显示任何日志信息

android - 如何对各种 TextView 进行比例缩放

android - RecyclerView 项目没有改变

c++ - 通过 TCP 发送图片

android - 改造 2 : Custom annotations for custom interceptor

android - View Pager Transformation 像卡片一样置于顶部