2016-09-29 20 views
-1

我在android中编写了套接字连接,并希望通过它发送xml。 以下是我的socket编程如何在套接字连接中发送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

<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"/> 

在工作C++编写代码平台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

您是否在清单文件中设置了权限以允许您的应用程序连接到网络? – 2016-09-29 08:32:58

+0

服务器如何读取数据?如果期待一条线,则不会发送一条线。 – EJP

+0

服务器期待整个XML,并会发送代表的答复之前,该服务器sould知道,它有多少字符,它必须阅读..所以我的问题是如何告诉服务器,读到这个字符 – MKY

回答

-1

好像你需要冲洗流。 您需要在调用outToServer.writeBytes(message)后添加outToServer.flush();

Log.d(TAG,"TCP Connected."); 
outToServer.writeBytes(message); 
outToServer.flush(); // <---- Add this line 
modifiedSentence = inFromServer.readLine(); 
Log.d(TAG,modifiedSentence); 
Log.d(TAG,"sucess"); 
+0

“DataOutputStream”和套接字的输出流都没有被缓冲,所以刷新它们什么也不做。 – EJP

0

您最终发布的工作客户端代码在数据前以网络字节顺序发送一个32位长的字。你没有发送。在发送数据之前,您需要使用DataOutputStream.writeInt()发送它。在开始对客户进行编码之前,您应该已经了解了这一点,或者通知了您自己。

+0

代码我曾经在C++中发布的代码是在客户端工作的代码,而不是严格的 。 – MKY

+0

@MKY不会改变我的答案。还有一个长词,你仍然没有发送它。 – EJP

+0

DataOutputStream.writeInt()为我工作:) – MKY

相关问题