Задать вопрос
vanesxl
@vanesxl

Почему не отправляется текст с клиента на сервер WebSocket?

Здравствуйте, пишу сетевое приложение, которое обменивается данными с сервером через WebSocket.
Клиент работает на Android
Серверная часть крутится у меня на компе) ее писал тоже на Java.
Для клиента и сервера использовал одну библиотеку
Сервер реализовал вот так:
import java.net.InetSocketAddress;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

public class SimpleServer extends WebSocketServer {

    public SimpleServer(InetSocketAddress address) {
        super(address);
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        System.out.println("new connection to " + conn.getRemoteSocketAddress());
        conn.send("Привет!");
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        System.out.println("closed " + conn.getRemoteSocketAddress() + " with exit code " + code + " additional info: " + reason);
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message);
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        System.err.println("an error occured on connection " + conn.getRemoteSocketAddress()  + ":" + ex);
    }

    public static void main(String[] args) {
        String host = "172.16.16.11";
        int port = 1122;

        WebSocketServer server = new SimpleServer(new InetSocketAddress(host, port));
        server.run();
    }
}

Вот как реализовал клиент:
package ru.domen.myapplication;




import android.util.Log;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.java_websocket.drafts.Draft;


import java.net.URI;

class SoketWS extends WebSocketClient{

    public SoketWS(URI serverURI, Draft draft) {
        super(serverURI);
    }

    public SoketWS(URI serverURI) {
        super(serverURI);
    }


    @Override
    public void onOpen(ServerHandshake handshakedata) {
        Log.d("test","есть контакт");
    }

    @Override
    public void onMessage(String message) {
        Log.d("test","Server: "+ message);
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        Log.d("test","Close");
    }

    @Override
    public void onError(Exception ex) {

    }
}

Вот часть кода в MainActivity которая создает экземпляр клиента:
try{
            WebSocketClient client = new SoketWS(new URI("ws://172.16.16.11:1122"), new Draft_10());
            client.connect();
            client.send("Привет");
        }catch (URISyntaxException e){
            Log.d("test", "Не удалось подключиться к серверу");
        }
        catch (RuntimeException e){
            Log.d("test", "Исключение какое то с подключением");
        }

Для теста логика такая:
1 клиент подключается к серверу, на сервере выводится на экран то что клиент с таким то адресом подключился.
2 сервер посылает клиенту сообщение "Привет!"
3 клиент посылает серверу сообщение "привет!" но до сервера данное сообщение не доходит. Вываливается исключение RuntimeException:
07-31 10:43:13.008  19689-19689/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: ru.domen.myapplication, PID: 19689
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.domen.myapplication/ru.domen.myapplication.MainActivity}: org.java_websocket.exceptions.WebsocketNotConnectedException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
            at android.os.Handler.dispatchMessage(Handler.java:110)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:5292)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: org.java_websocket.exceptions.WebsocketNotConnectedException
            at org.java_websocket.WebSocketImpl.send(WebSocketImpl.java:566)
            at org.java_websocket.WebSocketImpl.send(WebSocketImpl.java:543)
            at org.java_websocket.client.WebSocketClient.send(WebSocketClient.java:171)
            at ru.domen.myapplication.MainActivity.onCreate(MainActivity.java:167)
            at android.app.Activity.performCreate(Activity.java:5264)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
            at android.os.Handler.dispatchMessage(Handler.java:110)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:5292)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
            at dalvik.system.NativeStart.main(Native Method)

Ошибка возникает вот в этой строке:
client.send("Привет");
В чем может быть проблема? Может я что то в манифесте не прописал?
Заранее большое спасибо!
  • Вопрос задан
  • 1122 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
vanesxl
@vanesxl Автор вопроса
Решил проблему сменой библиотеки.
Ответ нашел вот тут: autobahn.ws/android/gettingstarted.html
Единственное но, если подключать полный список библиотек:
  1. AutobahnAndroid
  2. Jackson Core
  3. Jackson Mapper

У меня вываливалась ошибка при сборке проекта, для реализации клиентской части для андроида, достаточно оставить AutobahnAndroid
в источнике также есть пример клиента.
При написании сервака оставил эту библиотеку
Ответ написан
Комментировать
@Alex_Laz
В коде не хватает проверки на подключение.
client.connect();
while(!client.isOpen){

}
client.send("Привет");
Нужно дождаться пока клиент приконнектится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы