2016-04-16 2 views
0

У меня есть приложение для Android-клиента и серверная программа на ПК. В клиентском приложении я запускаю новый поток в onCreate() моей активности. В этом потоке существует бесконечный цикл, который отправляет сообщение серверу. Но иногда есть задержка до 5 секунд. Вот код стороне клиента:Задержка программирования приложений для Android

EDIT

new Thread(new Runnable() { 
     public void run() { 
      Socket socket = null; 
      PrintWriter out = null; 
      try { 
       socket = new Socket(ip, 1755); 
       out = new PrintWriter(socket.getOutputStream(), true); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while(true) { 
       if(socket != null) { 
        out.println(msg); 
       } 
      } 
     } 
    }).start(); 

Теперь сообщение не доставляется.

+0

Вы действительно хотите создать сокет в цикле. Почему бы не создать один раз, а затем отправить в цикле, а затем закрыть его? – jgm

+0

Вы проверили мой ответ? – Krish

+0

@Krish Да, я просто проверил ваш ответ. Теперь я хочу отправлять сообщения всякий раз, когда пользователь прикасается к экрану. Итак, я просто позвоню sendMessage() внутри onTouchEvent()? –

ответ

1

См этот код,

import java.io.BufferedWriter; 
    import java.io.IOException; 
    import java.io.OutputStreamWriter; 
    import java.io.PrintWriter; 
    import java.net.InetAddress; 
    import java.net.Socket; 
    import java.net.UnknownHostException; 

    /** 
    * @author Krish 
    */ 
    public class Client { 


     public void connect() { 
      new Thread(new ClientThread()).start(); 
     } 


     public void disconnect() { 
      try { 
       socket.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 


     public void sendMessage(String msg) { 
      try { 
       PrintWriter out = new PrintWriter(new BufferedWriter(
         new OutputStreamWriter(socket.getOutputStream())), 
         true); 


      out.println(msg); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 


    private Socket socket; 

    class ClientThread implements Runnable { 

     private static final int SERVERPORT = 6000; 

     private static final String SERVER_IP = "10.0.2.15"; 


     @Override 
     public void run() { 

      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 

    } 

} 

А также найти оптимизация Techniq

+0

Это дает исключение null указателя в sendMessage(). –

+0

гнездо объект может быть пустым. Потому что он не синхронизирован. Поэтому после этого выполните обратный вызов для состояния соединения и sendMessage. – Krish

+0

Вы попробовали мой ответ? – Krish

0

Может быть, потому что вы создаете бесконечное количество сокетов и отправляете. Вместо того, чтобы создавать один раз и отправлять затем закрытие или может быть проблемой сети.

+0

Если я создаю бесконечное количество сокетов, я также закрываю их. Так в чем проблема? –

+0

@SalmanYounas Проблема в том, что вы делаете это нелегко, тратя ресурсы и сетевой трафик. – EJP

+0

@EJP Вы можете исправить код, пожалуйста? –

Смежные вопросы