socket.io和okhttp3冲突
socket.io and okhttp3 conflict
我在 Android 项目中使用 okhttp3 进行网络连接,io.socket:socket.io-client:0.8.3 用于 socket.io 连接。
以下是我的 gradle 文件的摘录。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile group: 'com.google.code.gson', name: 'gson', version: '2.4'
compile('com.digits.sdk.android:digits:2.0.5@aar') {
transitive = true;
}
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okhttp3:okhttp-ws:3.4.2'
testCompile 'junit:junit:4.12'
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
}
然而当我运行项目抛出以下异常:
java.lang.NoSuchMethodError: No direct method <init>(Lokhttp3/Request;Lokhttp3/WebSocketListener;Ljava/util/Random;)V in class Lokhttp3/internal/ws/RealWebSocket; or its super classes (declaration of 'okhttp3.internal.ws.RealWebSocket' appears in /data/data/com.fouadkada.mysioapplicationpoc/files/instant-run/dex/slice-okhttp-ws-3.4.2_208c84938ec045e30eddb95384859b3e594c4d81-classes.dex)
at okhttp3.OkHttpClient.newWebSocket(OkHttpClient.java:414)
at io.socket.engineio.client.transports.WebSocket.doOpen(WebSocket.java:78)
at io.socket.engineio.client.Transport.run(Transport.java:82)
at io.socket.thread.EventThread.exec(EventThread.java:55)
at io.socket.engineio.client.Transport.open(Transport.java:77)
at io.socket.engineio.client.Socket.probe(Socket.java:472)
at io.socket.engineio.client.Socket.onOpen(Socket.java:485)
at io.socket.engineio.client.Socket.onHandshake(Socket.java:526)
at io.socket.engineio.client.Socket.onPacket(Socket.java:499)
at io.socket.engineio.client.Socket.access00(Socket.java:31)
at io.socket.engineio.client.Socket.call(Socket.java:313)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.engineio.client.Transport.onPacket(Transport.java:134)
at io.socket.engineio.client.transports.Polling.access0(Polling.java:17)
at io.socket.engineio.client.transports.Polling.call(Polling.java:124)
at io.socket.engineio.parser.Parser.decodePayload(Parser.java:251)
at io.socket.engineio.client.transports.Polling._onData(Polling.java:134)
at io.socket.engineio.client.transports.Polling.onData(Polling.java:106)
at io.socket.engineio.client.transports.PollingXHR.run(PollingXHR.java:111)
at io.socket.thread.EventThread.run(EventThread.java:80)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
我已经尝试了此处建议的解决方案:https://github.com/socketio/socket.io-client-java/issues/337 但没有成功
有什么想法吗?
看起来 Socket IO 不支持 OkHttp 3.5.0 中的新 websockets API launched。
您需要向他们发送拉取请求以更新其实现以使用 OkHttp 的新 websockets API。或者您可以将自己的代码回滚到 OkHttp 3.4.1。
在 socket github 页面的问题部分发帖后。io-client-java,我得到了解决问题的答案。
解决方案是删除对 okhttp-ws:3.4.2 的依赖,因此依赖块变成如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile group: 'com.google.code.gson', name: 'gson', version: '2.4'
compile('com.digits.sdk.android:digits:2.0.5@aar') {
transitive = true;
}
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
testCompile 'junit:junit:4.12'
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
}
我在 Android 项目中使用 okhttp3 进行网络连接,io.socket:socket.io-client:0.8.3 用于 socket.io 连接。
以下是我的 gradle 文件的摘录。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile group: 'com.google.code.gson', name: 'gson', version: '2.4'
compile('com.digits.sdk.android:digits:2.0.5@aar') {
transitive = true;
}
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okhttp3:okhttp-ws:3.4.2'
testCompile 'junit:junit:4.12'
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
}
然而当我运行项目抛出以下异常:
java.lang.NoSuchMethodError: No direct method <init>(Lokhttp3/Request;Lokhttp3/WebSocketListener;Ljava/util/Random;)V in class Lokhttp3/internal/ws/RealWebSocket; or its super classes (declaration of 'okhttp3.internal.ws.RealWebSocket' appears in /data/data/com.fouadkada.mysioapplicationpoc/files/instant-run/dex/slice-okhttp-ws-3.4.2_208c84938ec045e30eddb95384859b3e594c4d81-classes.dex)
at okhttp3.OkHttpClient.newWebSocket(OkHttpClient.java:414)
at io.socket.engineio.client.transports.WebSocket.doOpen(WebSocket.java:78)
at io.socket.engineio.client.Transport.run(Transport.java:82)
at io.socket.thread.EventThread.exec(EventThread.java:55)
at io.socket.engineio.client.Transport.open(Transport.java:77)
at io.socket.engineio.client.Socket.probe(Socket.java:472)
at io.socket.engineio.client.Socket.onOpen(Socket.java:485)
at io.socket.engineio.client.Socket.onHandshake(Socket.java:526)
at io.socket.engineio.client.Socket.onPacket(Socket.java:499)
at io.socket.engineio.client.Socket.access00(Socket.java:31)
at io.socket.engineio.client.Socket.call(Socket.java:313)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.engineio.client.Transport.onPacket(Transport.java:134)
at io.socket.engineio.client.transports.Polling.access0(Polling.java:17)
at io.socket.engineio.client.transports.Polling.call(Polling.java:124)
at io.socket.engineio.parser.Parser.decodePayload(Parser.java:251)
at io.socket.engineio.client.transports.Polling._onData(Polling.java:134)
at io.socket.engineio.client.transports.Polling.onData(Polling.java:106)
at io.socket.engineio.client.transports.PollingXHR.run(PollingXHR.java:111)
at io.socket.thread.EventThread.run(EventThread.java:80)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
我已经尝试了此处建议的解决方案:https://github.com/socketio/socket.io-client-java/issues/337 但没有成功
有什么想法吗?
看起来 Socket IO 不支持 OkHttp 3.5.0 中的新 websockets API launched。
您需要向他们发送拉取请求以更新其实现以使用 OkHttp 的新 websockets API。或者您可以将自己的代码回滚到 OkHttp 3.4.1。
在 socket github 页面的问题部分发帖后。io-client-java,我得到了解决问题的答案。
解决方案是删除对 okhttp-ws:3.4.2 的依赖,因此依赖块变成如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile group: 'com.google.code.gson', name: 'gson', version: '2.4'
compile('com.digits.sdk.android:digits:2.0.5@aar') {
transitive = true;
}
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
testCompile 'junit:junit:4.12'
compile('io.socket:socket.io-client:0.8.3') {
exclude group: 'org.json', module: 'json'
}
}