2016-04-16 11 views
0

PCにクライアントアンドロイドアプリとサーバプログラムがあります。クライアントアプリケーションでは、自分のアクティビティのonCreate()で新しいスレッドを開始します。そのスレッドには、サーバーにメッセージを送信する無限ループがあります。しかし時には最大5秒の遅延があります。今、メッセージが配信されていないAndroid Socket Programming Delay

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

は、あなたが本当にループ内でソケットを作成しますかtechniq最適化を見つけます。一度作成してからループを送信して閉じないのはなぜですか? – jgm

+0

私の答えを確認しましたか? – Krish

+0

@Krishはい、私はあなたの答えをチェックしました。今私はユーザーが画面に触れるたびにメッセージを送信したいと思います。だから、私はonTouchEvent()内でsendMessage()を呼び出すだけですか? –

答えて

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(); 
      } 

     } 

    } 

} 

+0

sendMessage()でnullポインタ例外が発生しています。 –

+0

ソケットオブジェクトがnullの可能性があります。同期されていないためです。したがって、接続状態のコールバックとその後のsendMessageを実装します。 – Krish

+0

あなたは私の答えを試しましたか? – Krish

0

無限の量のソケットを作成して送信している可能性があります。一度作成してから送信するか、ネットワークの問題になる可能性があります。

+0

無限のソケットを作成している場合は、それらも閉じます。だから何が問題なの? –

+0

@SalmanYounas問題は、リソースやネットワークトラフィックを無駄にしてしまいます。 – EJP

+0

@EJP私のコードを修正できますか? –