【问题标题】:How to connect web socket protocol using socket.io in android如何在android中使用socket.io连接网络套接字协议
【发布时间】:2018-12-19 09:52:10
【问题描述】:

我正在尝试使用socket.io 在我的服务器和我的应用程序之间建立通信。但它显示socket.io 无法连接到具有ws 协议的服务器。

我的服务器 url 类似于 -->

ws://dev1.geobit.siliconorchard.com:3366/socket.io/?EIO=4&transport=websocket

我的代码是:

private Socket mSocket;

{
    try {
        IO.Options opts = new IO.Options();
        opts.transports = new String[]{ WebSocket.NAME};
        mSocket = IO.socket(new URI(Constant.WEB_SOCKET),opts);

    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    }
}

public Socket getSocket() {
    return mSocket;
}

这显示了

错误

"java.lang.RuntimeException: 无法实例化应用程序 com.dev.quras.application.QurasApplication: java.lang.RuntimeException: java.net.URISyntaxException: 未知协议: ws: ws://dev1.geobit.siliconorchard .com:3366/socket.io/?EIO=4&transport=websocket"

谁能帮我解决这个问题?

【问题讨论】:

    标签: android websocket socket.io


    【解决方案1】:

    我为此使用了 Okhttp:

    private fun loggingInterceptor(): HttpLoggingInterceptor =
            HttpLoggingInterceptor(HttpLoggingInterceptor
                    .Logger { message -> Timber.tag("OkHttp").d(message) })
                    .setLevel(HttpLoggingInterceptor.Level.BODY)
    
    private val okHttp = OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(300, TimeUnit.SECONDS)
            .addInterceptor(loggingInterceptor())
            .readTimeout(60, TimeUnit.SECONDS)
            .build()
    

    然后你可以像这样启动一个websocket:

    val listener = SocketListener()
    val request = Request.Builder()
                            .url("${socketURL}?access_token=${token()}")
                            .build()
    
    val socket = okHttp.newWebSocket(request, listener)
    

    监听类示例:

    class SocketListener() : WebSocketListener() {
    
        override fun onMessage(webSocket: WebSocket?, text: String?) {
            try {
                val json = JSONObject(text)
                val payload = json.getJSONObject("payload")
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    
        override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {
            webSocket?.close(NORMAL_CLOSURE_STATUS, null)
        }
    
        companion object {
            private const val NORMAL_CLOSURE_STATUS = 1000
        }
    }
    

    【讨论】:

    • 非常感谢您的回答,但我一直在寻找将具有 ws 协议的服务器与 socket.io 连接的方法。你能在这个过程中帮助我吗?
    猜你喜欢
    • 2018-08-24
    • 2019-02-15
    • 1970-01-01
    • 2013-07-24
    • 2016-03-30
    • 2016-10-16
    • 2020-08-10
    • 2016-09-14
    • 2016-02-03
    相关资源
    最近更新 更多