2016-04-07 23 views
0

アンドロイドには新しく、ソケットプログラミングに関する問題があります。コード上Javaでバイト配列を送受信するソケットプログラミング

class ClientAsycTask extends AsyncTask<String,Void,String>{ 
    ProgressDialog progress; 
    @Override 
    protected void onPreExecute() { 
     progress = new ProgressDialog(MainActivity.this); 
     progress.setMessage("Connection Server Please wait"); 
     progress.setIndeterminate(true); 
     progress.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String result = null; 
     Socket socket = new Socket(); 
     String host = "systemteq.gotdns.com"; 
     Integer port = 4999; 
     DataOutputStream s_out = null; 
     BufferedReader s_in = null; 
     try{ 
      socket.connect(new InetSocketAddress(host, port)); 
      s_out = new DataOutputStream(socket.getOutputStream()); 
      s_in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00}; 
      s_out.write(messages); 
      String response; 
      while((response = s_in.readLine())!=null){ 
       result += response; 
      } 
      //result = "Successfully"+s_in.read();//s_in.readLine(); 
      socket.close(); 

     }catch (Exception e){ 
      Toast.makeText(MainActivity.this,"systemteq.gotdns.com:4999 not connected",Toast.LENGTH_SHORT).show(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     if(progress.isShowing()){ 
      progress.dismiss(); 
     } 
     Toast.makeText(MainActivity.this,"Connected "+s,Toast.LENGTH_SHORT).show(); 
     tv.setText(s); 
    } 
} 

サーバ、サーバに進コードを送信一部進コードで応答し、10 01 20 10 00 [5バイト]言うことができます。

しかし、上記のコード実行ダイアログは決して閉じることはありません。私はs_in.readLine()には、サーバーからの応答を読み取るいくつかの問題があることがわかりました。

私は多くのリンクを通過しましたが、この問題を解決するには成功しませんでした。親切に私はこれを解読するのに役立ちます。

UPDATE: -

するDataInputStreamを使用した後: -

s_in = new DataInputStream(socket.getInputStream()); 
      byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00}; 
      s_out.write(messages); 
      String response; 
      System.out.println("START"); 
      result = s_in.readUTF(); 

それはまだ応答バイトを取ることはありません。リクエストは成功しましたが。

アップデート2

byte m = s_in.readByte(); 
result = Byte.toString(m); 

今バイトの値を取得していますが、私は一つだけを取得しています代わりに5つのバイトを得るための、5つのバイトを取得する必要があります。このことで私を助けてください

答えて

3

バイナリデータを待っている場合はInputStreamReaderを使用せず、DataInputStreamを代わりに試してください。
readLine()は、 '\ n'、 '\ r'、 '\ r \ n'またはリーダーの最後を待ちます。

UPDATE:正確なバイト数を知っている場合は、配列に読み込みます。

byte[] buf = new byte[5]; 
s_in.read(buf); 
+0

はい、試しました。更新された質問を確認してください – RKD

+0

私はreadUTFがreadLineと何をしていると思います – RKD

+0

サーバがあなたにバイトを送るならば、なぜそれらを常にStringとして読むのですか?バイトを[]バッファに読み込みます。容易いものだ。文字列はもっと複雑です。 –

関連する問題