Здравствуйте.Есть код, он отправляет 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.
Комментариев нет:
Отправить комментарий