Как связаться с вебсокетом по аналогии с 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 шт):
Попробуйте так:
// тут инициализация 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'ом в соответствующем колбэке, если сервер разговорчивый.