2016-05-27 11 views
-1

アンドロイドアプリとWindows C++ winsockがTCPソケットを使用して通信し、アンドロイドからC++サーバーに文字列を送信しましたが、C++サーバーからAndroidクライアントに文字列を送信できません。ここでC++ winsockからTCPソケット経由でAndroidに文字列を送信するにはどうすればよいですか?

は重要なC++サーバーの一部です:

 recvbuf = "Back At u \0"; 
     cout << " \n " << recvbuf << "\n"; 
     int iResult= send(ClientSocket, recvbuf, (int) strlen(recvbuf), 0); 

     if (iResult == SOCKET_ERROR) { 
      wprintf(L"send failed with error: %d\n", WSAGetLastError()); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return 1; 
     } 

     printf("Bytes Sent: %d\n", iResult); 

そしてここでは、一部が供給アンドロイドクライアントです:

class TextRcv extends AsyncTask<Void, Void, String> 
{ 

    @Override 
    protected String doInBackground(Void... params) { 

     //TO SEND A STRING 
      Socket clientSocket = null; 
     try { 
      clientSocket= new Socket("192.168.1.5",8889); 
      DataOutputStream oos= new DataOutputStream(clientSocket.getOutputStream()); 
      oos.writeBytes(String.valueOf(mystr.length())); 
      oos.flush(); 
      byte[] bufferout=mystr.getBytes(); 
      oos.write(bufferout, 0, bufferout.length); 
      oos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

//to recieve a string 
     String input =null; 
     char[] buffin=new char[128]; 
     try { 

      BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      in.read(buffin, 0, 128); 
      input=String.valueOf(buffin); 

      clientSocket.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return input; 
    } 

    @Override 
    protected void onPostExecute(String input) { 
     super.onPostExecute(input); 
     Toast toast=Toast.makeText(getApplicationContext(),input,Toast.LENGTH_LONG); 
     toast.show(); 
     } 

} 

C++出力がそこにはエラーがなく、11バイト(長さということを述べていますrecvbuff文字列の)が送信されます。しかし、アンドロイドでは、 'input'文字列は常にnullです。

Start Receving 
length of string recieved in bytes =14 
AndroidID - Hello World... 

Done 
Back At u 
Bytes Sent: 11 

Press any key to continue . . . 
+0

Androidの出力はどこですか?それがヌルであることをどうやって知っていますか注意: 'read()'によって返された長さを無視し、バッファをいっぱいにすると仮定します。これを行うことは指定されていません。なぜ同じことを二度送っているのですか? – EJP

+0

@EJP私はトーストがキャラクターなしで表示されるので、アンドロイドの出力がヌルであることを知っています。また、私はif(input == null)チェックをして、それは本当だった。 –

+0

@ EJP同じことを2回送信することで何を意味するのか分かりません。それを詳しく教えてください。ありがとう –

答えて

0
String input =null; 

inputがnullの場合、この時点で: はここで、C++サーバ出力です。

char[] buffin=new char[128]; 
try { 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    in.read(buffin, 0, 128); 
    input=String.valueOf(buffin); 

このコードは正しくありませんが、それがすべてで実行された場合、inputはおそらくnullにすることはできません。次のように正しいコードは次のとおりです。

戻るあなたのコードに
int count = in.read(buffin); 
if (count > 0) 
{ 
    input = new String(buffin, 0, count); 
} 

clientSocket.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
return input; 

inputは、この時点ではまだnullの場合は、開示されていないIOExceptionがあったに違いありません。

+0

お返事ありがとうございます。なぜIOExceptionを書く必要があるのか​​、存在しない場合はどうなるのか理解できないと思いますか?また、あなたはIOExceptionに入れなければならないと思いますか?私を許しても、私はまだ学んでいます:) –

+0

これはonpostexecute()の 'input'文字列をトーストしようとするときに得られるものです:https://www.dropbox.com/s/re1uiv0gh5raup4/Screenshot_2016-05- 27-06-49-44.png?dl = 0 –

+0

私はあなたが示唆したようにコードを調整しました...私はまた、カウント番号をトーストしようとしたと0を返しました –

関連する問題