#java #android #сокет
Хочу воспользоваться библиотекой compile 'io.socket:socket.io-client:0.6.1', вот ссылка И я смог настроить соединение с сервером. Когда я соединяюсь, сервер видит клиента, и даже получает шаблонное сообщение. Но дальше я не могу передавать сообщения на сервер. Вот кусочек кода, который отвечает за подключение: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView status; private Button button; private Socket socket; { try { socket = IO.socket(Constants.CHAT_SERVER_URL); } catch (URISyntaxException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); status = (TextView) findViewById(R.id.status); button = (Button) findViewById(R.id.button); button.setOnClickListener(this); socket.connect(); if (socket.connected()) { status.setText("Connected"); } else { status.setText("Disconnected"); } } Я запускаю приложение, создается сокет, и на сервере срабатывает событие о том, что клиент подключился. Это после строчки socket.connect(); А так же на сервере видно такие логи: Welcome to Server side Waiting for a client...Client connected Wait for messages GET /socket.io/?EIO=3&transport=polling HTTP/1.1 User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.7; Android SDK built for x86 Build/GINGERBREAD) Host: 10.0.2.2:4444 Connection: Keep-Alive Accept-Encoding: gzip То есть, клиент действительно присоединился, и отправил какие то данные. Но дальше непонятно. Первое это то, что не срабатывает мое условие: if (socket.connected()) { status.setText("Connected"); } else { status.setText("Disconnected"); } потому-что socket.connected() возвращает false. НО на стороне сервера показано, что соединение установлено (если я закрою клиента, то и сервер говорит, что соединение разорвано). Выходит, сервер видит, что клиент присоединен, но на клиенте говорится, что соединения нет. И при попытке отправить сообщение на сервер: @Override public void onClick(View v) { if (v.getId() == R.id.button) { socket.send("::::::::::::::::::::::::::::::::::::::::::::"); } } НИЧЕГО НЕ ПРОИСХОДИТ! Как проверить или сделать, чтобы все заработало? Мне просто нужно String посылать на сервер и ВСЕ. Вот код СЕРВЕРА: public class Server { public static void main(String[] args) throws IOException { System.out.println("Welcome to Server side"); BufferedReader in = null; PrintWriter out = null; ServerSocket servers = null; Socket fromclient = null; // create server socket try { servers = new ServerSocket(4444); } catch (IOException e) { System.out.println("Couldn't listen to port 4444"); System.exit(-1); } try { System.out.print("Waiting for a client..."); fromclient = servers.accept(); System.out.println("Client connected"); } catch (IOException e) { System.out.println("Can't accept"); System.exit(-1); } in = new BufferedReader(new InputStreamReader(fromclient.getInputStream())); out = new PrintWriter(fromclient.getOutputStream(), true); String input, output; System.out.println("Wait for messages"); while ((input = in.readLine()) != null) { System.out.println(input); } out.close(); in.close(); fromclient.close(); servers.close(); } }
Ответы
Ответ 1
Во первых: Библиотека ассинхронная. Что это значит? То, что следующий код socket.connect(); if (socket.connected()) { status.setText("Connected"); } else { status.setText("Disconnected"); } Всегда войдет в else. потому, что socket.connect() - ассинхронный метод, выполняется в отдельном потоке, и если сразу же спросить у сокета socket.connected(), то он вернет false, потому, что connect не успел еще выполниться. Вместо этого надо повесить Listener перед тем, как вызвать connect: socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { //делаем все, что надо сделать после успешного коннекта } }) На счет остального - проверьте код сервера, мне показалось, что он должен обработать только первый коннект, и сразу завершиться.
Комментариев нет:
Отправить комментарий