【发布时间】: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