Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Установка непрерывного соединения с сервером

Здравствуйте.Есть код, он отправляет hello при помощи веб сокетов на сервер и сразу заканчивает соединение. Я пытаюсь сделать что бы соединение не прерывалось а продолжало слушать и ждать следующего сообщения. Вот код:
public class MainActivity extends AppCompatActivity { private Button start; private TextView out; private OkHttpClient client; private final class Echo extends WebSocketListener{ private static final int NORMAL_CLOSURE_STATUS = 1000; @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("hello");
webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); }
@Override public void onMessage(WebSocket webSocket, String text) { out("R"+text); }

@Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { out("error"+t.getMessage()); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start =(Button)findViewById(R.id.button); out=(TextView)findViewById(R.id.textView); client= new OkHttpClient();

start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {
start(); } });
} private void start(){
Request request = new Request.Builder().url("ws://адрес:8081").build(); Echo listener = new Echo(); WebSocket ws = client.newWebSocket(request, listener);
//client.dispatcher().executorService().shutdown(); }
private void out(final String txt){ runOnUiThread(new Runnable() { @Override public void run() { out.setText(out.getText().toString()+"

"+ txt); } });
}
}
Я попытался удалить строку webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); это сработало но при каждом следующем нажатии на кнопку "отправить" количество сообщений "hello" увеличивалось на одно, т.е нажимаю один раз, отправляется 2 сообщения, нажимаю еще раз - отправляется 3 . Подскажите, в чем проблема?


Ответ

Пока не пришел кто-то поумнее, предложу вам эксперимент:
@Override public void onOpen(WebSocket webSocket, Response response) { int i = 0; webSocket.send("hello" + i++); webSocket.send("hello" + i);
webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); }
Сделайте так и нажмите 2-3 раза. Мне интересно, сокет хранит в буфере сообщения и дублирует их, или какая-нибудь часть кода вызывает метод 2 раза.

Попробуйте удалить webSocket.close(NORMAL_CLOSURE_STATUS,"bye"); можно вынести в onClosed или onClosing
Потом
Request request = new Request.Builder().url("ws://адрес:8081").build(); Echo listener = new Echo(); WebSocket ws = client.newWebSocket(request, listener);
вынесете в переменные класса, т.к. при каждом нажатии у вас создаются новые объекты и видимо WebSocketListener обрабатывает все доступные WebSocket.

Комментариев нет:

Отправить комментарий