Как связаться с вебсокетом по аналогии с js android?

Есть код на js:

token = 'some_data';
sid = 'some_data';
ws = new WebSocket('some_data' + sid + '/');
ws.onmessage = function(resp){console.log(resp)};
ws.send(JSON.stringify({'token':token}));
ws.send(JSON.stringify({'chat':{'a':'init', 'rtc_supported': false}}));
ws.send(JSON.stringify({'chat':{'a':'send', 'to': '03654ps', 'body':'preved', 'stamp': 0}}));

я пытаюсь сделать подключение к серверу через okHttp:

val loggingInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor()
    .setLevel(HttpLoggingInterceptor.Level.BODY)


val client = OkHttpClient.Builder()
    .connectTimeout(60, TimeUnit.SECONDS)
    .writeTimeout(300, TimeUnit.SECONDS)
    .addInterceptor(loggingInterceptor)
    .readTimeout(60, TimeUnit.SECONDS)
    .build()

val json = "application/json; charset=utf-8".toMediaTypeOrNull()
val params: MutableMap<String, String> = HashMap()
params["token"] = getSharedPreferences("app_data", 0).getString("access_token", "")!!
val parameter = JSONObject(params as Map<*, *>)

val body: RequestBody = parameter.toString().toRequestBody(json)

val request = Request.Builder()
    .url(CHAT_URL)
    .post(body)
    .build()


val webSocket = client.newWebSocket(request, EchoWebSocketListener())

client.dispatcher.executorService.shutdown()

если я правильно понял то без токена у меня сервер ничего не вернет. Добавляю токен как можно понять из кода в тело запроса:

val json = "application/json; charset=utf-8".toMediaTypeOrNull()
val params: MutableMap<String, String> = HashMap()
params["token"] = getSharedPreferences("app_data", 0).getString("access_token", "")!!
val parameter = JSONObject(params as Map<*, *>)

val body: RequestBody = parameter.toString().toRequestBody(json)

Но если делать таким образом, то получаю такую ошибку:

java.lang.IllegalArgumentException: Request must be GET: POST

Либо эти вещи вообще не так делаются, либо я что-то не так делаю вообще. Сам адрес сервера выглядит так:

wss://test_server.net:4433/ws/jwt/jfagdod

Не могу понять где именно ошибся и как исправить.


Ответы (1 шт):

Автор решения: Yura Ivanov

Попробуйте так:

// тут инициализация client'а
// ...
val request = Request.Builder().url(CHAT_URL).build()
val webSocket = client.newWebSocket(request, EchoWebSocketListener())
webSocket.send("{'token':'some token'}")
webSocket.send("{'chat':{'a':'init', 'rtc_supported': false}}");
webSocket.send("{'chat':{'a':'send', 'to': '03654ps', 'body':'preved', 'stamp': 0}}");
// ...
// потом закрыть
webSocket.close(NORMAL_CLOSURE_STATUS, null); // NORMAL_CLOSURE_STATUS = 1000 rfc6455

Вы создаете вебсокет. Соединение устанавливается и не рвется пока кто-то его не порвет, вы или сервер, с ошибкой или нормально. Шлете plaintext в него пока не надоест. Из него соответственно получаете данные тоже plaintext'ом в соответствующем колбэке, если сервер разговорчивый.

→ Ссылка