这几天对接了一个WebSocket,一开始使用的Java_webSocket这个库,
// https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket
implementation 'org.java-websocket:Java-WebSocket:1.5.2'
// https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12
testImplementation 'org.slf4j:slf4j-log4j12:1.7.30'
使用着觉得不好封装,网上搜索了一番,看到这个
https://www.jianshu.com/p/57a91bd2b68f
觉得还可以,只是我只是对接一个接口而已,没必要这么复杂。
引用的库是
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation 'com.google.code.gson:gson:2.8.8'
// https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
整了个java测试类,如下
package com.your.pkgname;
import android.support.annotation.NonNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;
/**
* 使用okhttp来实现WebSocket
* https://www.jianshu.com/p/57a91bd2b68f
*/
public class OkHttpWebSocket {
private WebSocket mWebSocket;
@Before
public void setUp() throws Exception {
final OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(3, TimeUnit.SECONDS)//设置写的超时时间
.connectTimeout(3, TimeUnit.SECONDS)//设置连接超时时间
.build();
//连接地址
final String url = "ws://your.url";
//构建一个连接请求对象
final Request request = new Request.Builder()
.get()
.url(url)
.build();
mWebSocket = client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(@NonNull WebSocket webSocket, @NonNull Response response) {
super.onOpen(webSocket, response);
System.out.println("onOpen");
}
@Override
public void onMessage(@NonNull WebSocket webSocket, @NonNull String text) {
super.onMessage(webSocket, text);
System.out.println("onMessage,text = " + text);
}
@Override
public void onMessage(@NonNull WebSocket webSocket, @NonNull ByteString bytes) {
super.onMessage(webSocket, bytes);
System.out.println("onMessage,bytes = " + bytes);
}
@Override
public void onClosing(@NonNull WebSocket webSocket, @NonNull int code, String reason) {
super.onClosing(webSocket, code, reason);
System.out.println("onClosing");
}
@Override
public void onClosed(@NonNull WebSocket webSocket, @NonNull int code, String reason) {
super.onClosed(webSocket, code, reason);
System.out.println("onClosed");
}
@Override
public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, Response response) {
super.onFailure(webSocket, t, response);
System.out.println("onFailure reason = " + t.getLocalizedMessage());
}
});
}
@After
public void tearDown() throws Exception {
mWebSocket.close(0, "123");
}
@Test
public void start() throws Exception {
Thread.sleep(TimeUnit.SECONDS.toMillis(30));
}
}
当运行结束时,回收资源时,出现了错误
@After
public void tearDown() throws Exception {
mWebSocket.close(0, "123");
}
提示错误如下:
ava.lang.IllegalArgumentException: Code must be in range [1000,5000): 0
at okhttp3.internal.ws.WebSocketProtocol.validateCloseCode(WebSocketProtocol.kt:134)
at okhttp3.internal.ws.RealWebSocket.close(RealWebSocket.kt:435)
at okhttp3.internal.ws.RealWebSocket.close(RealWebSocket.kt:427)
at com.your.pkgname.OkHttpWebSocket.tearDown(OkHttpWebSocket.java:80)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.RunAfters.invokeMethod(RunAfters.java:46)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
说是这个结束状态码只能是1000(包含)-5000(不含);
然而这些值到底是什么意思呢?
而原接口只是如下:
/**
* Attempts to initiate a graceful shutdown of this web socket. Any already-enqueued messages will
* be transmitted before the close message is sent but subsequent calls to [send] will return
* false and their messages will not be enqueued.
*
* This returns true if a graceful shutdown was initiated by this call. It returns false if
* a graceful shutdown was already underway or if the web socket is already closed or canceled.
*
* @param code Status code as defined by
* [Section 7.4 of RFC 6455](http://tools.ietf.org/html/rfc6455#section-7.4).
* @param reason Reason for shutting down, no longer than 123 bytes of UTF-8 encoded data (**not** characters) or null.
* @throws IllegalArgumentException if [code] is invalid or [reason] is too long.
*/
fun close(code: Int, reason: String?): Boolean
也没有相关的信息,打不开。
于是搜到了这个:
链接
https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
于是用Chrome翻译了一下,截图如下:
图片1
图片2
初步算是解决了,tearDown代码改成如下:
@After
public void tearDown() throws Exception {
mWebSocket.close(1000, "123");
}
ok.不做深究了,暂时解决了就好。