2016-09-29 3 views
-1

나는 안드로이드에서 소켓 연결을 작성했고 그것을 통해 XML을 보내려고합니다. 다음은 XML을 보낼 수있는 다른 방법이 있나요 .. 소켓 연결에서 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; 
} 

내가이 데이터가 단절이 요청에 응답하지 않기 때문에 서버로 보낼 수 없다는 생각 프로그래밍 내 소켓인가? 당신이 스트림을 출력 할 필요가 같은 C 코드 작업 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"/> 

에서

권한 ++ 플랫폼 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

응용 프로그램을 네트워크에 연결할 수 있도록 매니페스트 파일에 사용 권한을 설정 했습니까? –

+0

서버가 데이터를 어떻게 읽습니까? 그것이 선을 기다리고 있다면, 당신은 선을 보내지 않을 것입니다. – EJP

+0

서버가 전체 XML을 예상하고 그 서버가 그 문자를 읽어야하는 문자 수를 알 수 있기 전에 그 대신에 응답을 보냅니다 ... 내 질문은이 문자를 읽는 서버에 말하는 방법입니다 – MKY

답변

-1

보인다. outToServer.writeBytes (message) 호출 후 outToServer.flush()를 추가해야합니다.

+0

'DataOutputStream'도 소켓의 출력 스트림도 버퍼링되지 않으므로 플러시하지 않습니다. – EJP

0

마지막으로 게시 한 작동 클라이언트 코드는 데이터 앞에 네트워크 바이트 순서로 32 비트 길이의 단어를 보냅니다. 너는 그걸 보내지 않을거야. 데이터를 보내기 전에 DataOutputStream.writeInt()을 사용하여 보내야합니다. 클라이언트 코딩을 시작하기 전에이를 알았거나 알았어 야합니다.

+0

코드 내가 C++에 게시 한 코드는 서버 측이 아닙니다. 코드가 클라이언트 측에서 작동하는 코드입니다. – MKY

+0

@MKY 내 대답이 많이 바뀌지 않습니다. 아직도 길이 단어가 있고, 당신은 여전히 ​​그것을 보내지 않습니다. – EJP

+0

DataOutputStream.writeInt() 나를 위해 일했습니다. :) – MKY

관련 문제