简体   繁体   English

如何在套接字连接中发送xml

[英]How to send xml in socket connection

I wrote a socket connection in android and want to send the xml over that.我在 android 中编写了一个套接字连接,并希望通过它发送 xml。 following is my socket programming以下是我的套接字编程

   @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;
}

I think this data is not being send to server because sever is not responding to this request.. Is there any other way to send xml ?我认为这个数据没有被发送到服务器,因为服务器没有响应这个请求..还有其他方法可以发送 xml 吗?

Permission in androidManifest permission 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"/>

Working code in c++ platform QT client side 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);

The working client code you have finally posted sends a 32-bit length word in network byte order before the data.您最终发布的工作客户端代码在数据之前以网络字节顺序发送一个 32 位长度的字。 You aren't sending that.你不是发送那个。 You need to send it using DataOutputStream.writeInt() before sending the data.您需要在发送数据之前使用DataOutputStream.writeInt()发送它。 You should have been informed of this, or informed yourself, before you started coding the client.在您开始编写客户端代码之前,您应该被告知这一点,或告知您自己。

It seems like you need to flush the Stream.似乎您需要刷新 Stream。 You need to add outToServer.flush() after the call to outToServer.writeBytes(message);您需要在调用 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");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM