2016-04-05 18 views
1

私は同じ問題で多くの投稿を読んでいます。つまり、BufferedReader.readLine()という行を読んでいるので、サーバから"\n"を送信してアンドロイドのクライアントが新しい行になるようにしてください。しかし、私の問題は、デスクトップアプリケーションと通信しているときにサーバーコードを変更することができず、既にコード化されていることです。 "\n"を追加せずにサーバーからメッセージを読み取る方法はありますか?メッセージを取得しているどのように他のクライアント(Python)Android:サーバからのメッセージを受信して​​いないソケットクライアント

Android client class

public class TCPClient { 

private String serverMessage; 


public static String SERVERIP = "192.168.0.1"; // controllers IP address 
public static final int SERVERPORT = 10001; 
private OnMessageReceived mMessageListener = null; 
private boolean mRun = false; 
private PrintWriter out = null; 
private BufferedReader in = null; 


public TCPClient(final OnMessageReceived listener) 
{ 
    mMessageListener = listener; 
} 

/** 
    * Sends the message entered by client to the server 
    * @param message text entered by client 
    **/ 
public void sendMessage(String message) 
{ 
    if (out != null && !out.checkError()) 
    { 
     System.out.println("message: "+ message); 
     out.println(message); 
     out.flush(); 
    } 
} 

public void stopClient() 
{ 
    mRun = false; 
} 

public void run() { 

    mRun = true; 

    try { 
     if(!MainActivity.STATIC_IP.equals("")) 
     { 
      SERVERIP = MainActivity.STATIC_IP; 
     } 

     InetAddress serverAddr = InetAddress.getByName(SERVERIP); 
     Log.e("TCP SI Client", "SI: Connecting..."); 

     Socket socket = new Socket(serverAddr, SERVERPORT); 


     try { 

      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      Log.e("TCP SI Client", "SI: Sent."); 
      Log.e("TCP SI Client", "SI: Done."); 
      Log.e("Out Message",out.toString()); 

      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


      while (mRun) 
      { 
       serverMessage = in.readLine(); 

       if (serverMessage != null && mMessageListener != null) { 

        mMessageListener.messageReceived(serverMessage); 
        Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); 
       } 
       serverMessage = null; 
      } 
     } 
     catch (Exception e) 
     { 

      Log.e("TCP SI Error", "SI: Error", e); 
      e.printStackTrace(); 
     } 
     finally 
     { 
      socket.close(); 
     } 

    } catch (Exception e) { 
     Log.e("TCP SI Error", "SI: Error", e); 
    } 

} 

    public interface OnMessageReceived { 
     public void messageReceived(String message); 
    } 
} 

data = self.sock.recv(1024) 

何サーバーの送信コマンドは、最後に任意の改行なしの毎秒@alarm:On#, @alarm:Off# 4コマンドです。

+0

他のクライアントはどうしますか?プロトコルはすでに定義されていなければなりません。ちょうどそれを実装します。ここに誰も自分のプロトコルについて教えてくれる人はいません。コードではないテキストにはコード書式を使用しないでください。 – EJP

+0

他のクライアントはPythonであり、self.sock.recv(1024) –

+0

を使用してデータを取得します。これがあれば、私は疑いますが、なぜこの場合は同じことをすることはできませんか? – EJP

答えて

2

ありがとうございました@EJPあなたの手がかりが私を助けてくださいissue。 ここには作業codeがあります。

try { 
    out = new PrintWriter(socket.getOutputStream()); 
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
    int charsRead = 0; 
    char[] buffer = new char[BUFFER_SIZE]; 
    while (mRun) 
    { 
     charsRead = in.read(buffer); 
     serverMessage = new String(buffer).substring(0, charsRead); 
     if (serverMessage != null && mMessageListener != null) { 
      Log.i("Message from Server", serverMessage.toString()); 
     } 
    } 
}catch (Exception e){ 
    e.printStackTrace(); 
} 
+1

thxここに溶液を加える。それは私が問題を抱えていたのと同じ状況を解決するのに役立ちました。 – Tirolel

-2

Javaチュートリアル(Sockets)を使用して、使い方を理解してください。

あなたの質問は、サーバーメッセージがいつ終了するかわからないことを示唆しているので、私はバッファリングされたストリームを使用して読み込み可能な文字を数え、それらの文字を配列に読み込んで文字列に変換します。

+0

'読み取り可能な文字を数えます'を定義します。 – EJP

+0

もちろん、サブクラスに応じて[available()](https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available())を使用します。 –

関連する問題