2016-09-29 3 views
-1

私はアンドロイドでソケット接続を作成し、その上にxmlを送信します。次 がソケット接続でxmlを送信するには

@Override 
protected Void doInBackground(Void... params) { 
     String modifiedSentence; 
    try { 
     String message ; 
     message ="<?xml version=\"1.0\"?><body><sendrecv> <eventList><eventName>event</eventName> <eventName>event</eventName> <eventName>event</eventName></eventList> </sendrecv></body>"; 

     Log.d("String to send",message.toString()); 

     Socket clientSocket = new Socket("192.168.0.200", SERVERPORT); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     Log.d(TAG,"TCP Connected."); 
     outToServer.writeBytes(message); 
     modifiedSentence = inFromServer.readLine(); 
     Log.d(TAG,modifiedSentence); 
     Log.d(TAG,"sucess"); 

     /* clientSocket.close();*/ 

    } catch (Exception e) { 
     Log.d("TCP Error: ",e.toString()); 
    } 
    return null; 
} 

私のソケットプログラミングである私は、このデータがサーバがこの要求に応答していないため、サーバーに送信さ.. は、XMLを送信するために他の方法がありますされていないと思いますか? androidManifest許可で

許可Cのコードの作業

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

++プラットフォームQTクライアント側

int received; 
unsigned char header [4]; 
int len; 
int sent; 
unsigned char recvbuf[2048]; 
unsigned int payload_len; 


    sprintf (sendbuf, "%s", "<?xml version=\"1.0\"?>"\ 
            "<body>"\ 
             "<sendrecv>"\ 
              "<eventList>"\ 
               "<eventName>event1</eventName>"\ 
               "<eventName>event2</eventName>"\ 
               "<eventName>event3</eventName>"\ 
              "</eventList>"\ 
             "</sendrecv>"\ 
            "</body>"); 
} 
len = strlen ((const char*)sendbuf); 
header[0] = (unsigned char) (len >> 24); 
header[1] = (unsigned char) (len >> 16); 
header[2] = (unsigned char) (len >> 8); 
header[3] = (unsigned char) len; 
weht_writen(s.clientfd, header,4); 
weht_writen(s.clientfd, (unsigned char*)sendbuf,len); 

memset (header, 0x0, 4); 
received= weht_readn(s.clientfd,header,4); 
if(received<0) 
{ 
    qDebug()<<"Failed to read registration message header"; 
    return; 
} 

payload_len = header[0]; 
payload_len <<= 8; 
payload_len |= header[1]; 
payload_len <<= 8; 
payload_len |= header[2]; 
payload_len <<= 8; 
payload_len |= header[3]; 
received= weht_readn(s.clientfd,recvbuf,payload_len); 
+0

アプリケーションがネットワークに接続できるようにマニフェストファイルにアクセス許可を設定していますか? –

+0

サーバーはデータをどのように読み取っていますか?それが行を期待している場合、あなたは1つを送信していません。 – EJP

+0

サーバーはxml全体を期待し、そのサーバーの前に応答を送信します。そのサーバーは何文字を読みなければならないのですか。私の質問はサーバーにこの文字を読み上げる方法です。 – MKY

答えて

-1

あなたはストリームをフラッシュする必要があるように思えます。 outToServer.writeBytes(メッセージ)を呼び出した後にoutToServer.flush()を追加する必要があります。

+0

'DataOutputStream'もソケットの出力ストリームもバッファされていないので、それらをフラッシュすることは何もしません。 – EJP

0

最終的に投稿したワーキングクライアントコードは、データの前にネットワークバイトオーダーで32ビットの長さのワードを送信します。あなたはそれを送っていません。データを送信する前にDataOutputStream.writeInt()を使用して送信する必要があります。クライアントのコーディングを開始する前に、これについて知らされているか、または自分自身に知らされたはずです。

+0

コードこれまでにC++で投稿したものは、サーバー側ではありません そのコードはクライアントサイドで動作しています。 – MKY

+0

@MKY私の答えはあまり変わっていません。まだ長さの言葉があり、あなたはまだそれを送信していません。 – EJP

+0

DataOutputStream.writeInt()は私のために働いた:) – MKY

関連する問題