【问题标题】:How to send xml in socket connection如何在套接字连接中发送 xml
【发布时间】:2016-09-29 08:27:05
【问题描述】:

我在 android 中编写了一个套接字连接,并希望通过它发送 xml。 以下是我的socket编程

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

【问题讨论】:

  • 您是否在清单文件中设置了权限以允许您的应用程序连接到网络?
  • 服务器如何读取数据?如果它需要一条线路,那么您就不会发送一条。
  • 服务器期待整个 xml,并将在该服务器知道它必须读取多少字符之前发送代表该响应的响应。所以我的问题是如何告诉服务器读取到该字符
  • @EJP 我在 QT 中有工作代码,意思是 c++ 我可以在这里发布它,我需要在 java 中做同样的事情,但我不懂 c++..
  • server sould know that how many character it has to read。使用 DataOutputStream:writeUTF(str) 作为它首先发送的大小。

标签: java android serversocket


【解决方案1】:

您最终发布的工作客户端代码在数据之前以网络字节顺序发送一个 32 位长度的字。你不是发送那个。您需要在发送数据之前使用DataOutputStream.writeInt() 发送它。在您开始编写客户端代码之前,您应该已经知道这一点,或者告诉自己。

【讨论】:

  • 我在 c++ 中发布的代码不是服务器端,代码是客户端的工作代码。
  • @MKY 并没有太大改变我的答案。还有一个长度字,你还没有发送。
【解决方案2】:

您似乎需要刷新 Stream。 需要在调用 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");

【讨论】:

  • DataOutputStream 和套接字的输出流都没有被缓冲,所以刷新它们什么都不做。
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2010-12-30
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多