c++线程
void HTTPRequest::onRequest(void)
{
int nSuc = connectJava();
int code = 0;
if (0 == nSuc) {
if (m_postFields.size() > 0)
{
bool bNeedConnectSym = false;
for (Fields::iterator it = m_postFields.begin(); it != m_postFields.end(); ++it)
{
postContentJava(it->first.c_str(), it->second.c_str(), bNeedConnectSym);
bNeedConnectSym = true;
}
}
if (m_postDataLen > 0)
{
postContentByteArrayJava(m_postData, m_postDataLen);
}
if (m_postContent.size() > 0)
{
for (Fields::iterator it = m_postContent.begin(); it != m_postContent.end(); ++it)
{
postFromContentJava(it->first.c_str(), it->second.c_str());
}
}
if (m_postFile.size() > 0)
{
for (Fields::iterator it = m_postFile.begin(); it != m_postFile.end(); ++it)
{
postFromFileJava(it->first.c_str(), it->second.c_str());
}
}
if (NULL != m_httpMethod && 0 == strcmp(m_httpMethod, "POST")) {
postFormEndJava(isNeedBoundary());
}
//set cookie TODO
code = getResponedCodeJava();
// CCLOG("HTTPRequest responed code:%d", code);
char* header = NULL;
int nCounter = 0;
while(true) {
header = getResponedHeaderByIdxJava(nCounter);
if (NULL == header) {
break;
}
onWriteHeader(header, strlen(header));
free(header);
header = NULL;
nCounter++;
}
//get cookies
char* strCookies = getResponedHeaderByKeyJava("set-cookie");
if (NULL != strCookies) {
m_responseCookies = strCookies;
free(strCookies);
}
//content len
int nContentLen = getResponedHeaderByKeyIntJava("Content-Length");
while (true) {
char* recvData = NULL;
int nRecv = 0;
nRecv = getResponedStringJava(&recvData);
if (NULL == recvData) {
code = 0;
CCLOG("HTTPRequest - onRequest, get null responed string");
break;
} else {
if (1 == (char)(*recvData)) {
nRecv -= 1;
onWriteData(recvData + 1, nRecv);
//here m_responseDataLength have add nRecv value
onProgress(m_responseDataLength, nRecv, nContentLen, nRecv);
free(recvData);
} else {
// CCLOG("HTTPRequest - onRequest, responed string completed");
free(recvData);
break;
}
}
}
}
m_errorCode = code;
m_responseCode = code;
m_errorMessage = (code == 200) ? "" : getResponedErrJava();
m_state = (code == 200) ? kCCHTTPRequestStateCompleted : kCCHTTPRequestStateFailed;
m_curlState = kCCHTTPRequestCURLStateClosed;
}
java处理
static byte[] getResponedString(HttpURLConnection http) {
DataInputStream in;
try {
in = new DataInputStream(http.getInputStream());
} catch (IOException e) {
in = new DataInputStream(http.getErrorStream());
} catch (Exception e) {
Log.e(“Cocos2dxHttpURLConnection exception”, e.toString());
return null;
}
try {
byte[] buffer = new byte[1024];
byte[] retBuf = null;
int len = in.read(buffer);
// Log.i("QuickHTTPInterface", "have recv data:" + len);
if (-1 == len) {
retBuf = new byte[1];
retBuf[0] = 0;
} else {
retBuf = new byte[len+1];
retBuf[0] = 1;
System.arraycopy(buffer, 0, retBuf, 1, len);
}
return retBuf;
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
in = new DataInputStream(http.getInputStream());
这个可以正常返回, 但是执行了in = new DataInputStream(http.getErrorStream());后面到System.arraycopy(buffer, 0, retBuf, 1, len);一执行就被跳过,搞不懂为什么? 请大牛指点。