2012-05-16 6 views
1

Java 클라이언트는 TCP를 사용하여 C++ 서버에 연결할 수 있습니다. Java 클라이언트는 Win7에 있습니다. C++ 서버는 Linux에 있습니다.Java 클라이언트에서 C++ 서버로 데이터를 보내려면 어떻게해야합니까?

문제는 데이터를 C++ 서버에 성공적으로 보낼 수 없다는 것입니다. 자바 코드는 다음과 같습니다 당신의 친절한 도움

public static void main (String [] args) throws IOException { 
    Socket sock = new Socket("10.217.140.200",7000); 

    String id = "TEST"; 
    char encoding = 'a'; 

    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); 
    oos.flush(); 

    oos.writeObject(encoding); 

후, 지금의 OutputStream 사용하고 작동합니다. ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());을 삭제해야합니다. 그렇지 않으면 4 문자가 C++ 서버에 출력됩니다.

+0

문제가 어디 있는지 확실하게 알 수있는 충분한 정보를 제공하지는 않지만 처음에는'oos.flush()'는'oos.writeObject()'다음에 있어야합니다. – Mac

+0

덕분에, .flush()를 끝까지 이동합니다. – zhoubo

+0

이제 자바 클라이언트에서 C++ 서버로 데이터를 보낼 수 있습니다. 이상한 점은 데이터가 네 번째 위치에 저장된다는 것입니다 (0 ~ 3 위치가 이유는 모르겠다). 사용되지 않음). 수신 된 데이터를 C++ 측에서 인쇄 할 때 0에서 3까지의 결과는 2입니까? 처음 네 위치가 무엇을 사용하는지 알 수 있습니까? – zhoubo

답변

2

ObjectOutputStream을 사용하고 있습니다. Java object serialisation입니다. 이것은 여러 언어로 (쉽게) 이식 할 수 없습니다. 문자열 만 보내기 때문에 ObjectOutputStream을 사용할 필요가 없습니다. 소켓에서 반환 된 OutputStream을 사용하면됩니다.

+0

감사합니다. outputstream으로 바뀌 었습니다. 이제는 Java 클라이언트에서 C++ 서버로 데이터를 보낼 수 있습니다. 이상한 점은 데이터가 네 번째 위치에 저장된다는 것입니다. ~ 3 위치는 사용되지 않습니다. 내가받은 데이터를 C++ 측에서 출력 할 때, 0에서 3까지의 결과는 두 개입니까?처음 네 위치가 무엇을 사용하는지 알 수 있습니까? – zhoubo

+0

업데이트 된 코드로 원래의 질문을 편집하십시오. –

0

개체 직렬화를 위해 제 3 자 라이브러리를 사용하는 것이 좋습니다. 수동으로 작업하는 것은 시간이 많이 걸리며 오류가 발생하기 쉽습니다.

나는 개인적으로 큰 팬 Google Protocol Buffers입니다. 나는 거의 모든 프로젝트 (자바 서버, 닷넷 클라이언트, C++ 클라이언트)에서이를 적극적으로 사용한다.

프로토콜 버퍼는 효율적이고 확장 가능한 형식으로 구조화 된 데이터를 인코딩하는 방법입니다. Google은 거의 모든 내부 RPC 프로토콜 및 파일 형식에 대해 프로토콜 버퍼를 사용합니다.

다른 언어에 대한 구현 목록은 here입니다.

0

또한 C++ 측에서 JNI를 사용하여 비 직렬화 작업을 처리 할 수 ​​있습니다.

C++을 사용하여 Java 객체를 직접 역 직렬화 할 수 없습니다.

0

ObjectOutputStream을 사용하지 않도록 코드를 업데이트 한 후에는 소켓을 통해 전송하기 전에 문자열을 ASCII로 변환하지 않았거나 C++ 서버에 문제가있는 것으로 추측합니다. Java 문자열은 유니 코드를 비롯한 다양한 인코딩으로 표현 될 수 있습니다.

더 좋은 방법이 있습니까?

public static void main (String [] args) throws IOException 
{ 
    Socket sock = new Socket("10.217.140.200",7000); 
    String id = "TEST"; 

    OutputStream oos = sock.getOutputStream(); 

    oos.write(id.getBytes("US-ASCII")); 
    oos.flush(); 
} 

그렇지 않은 경우 질문을 편집하여 업데이트 된 클라이언트 및 서버 측 코드를 게시하십시오.

+0

테스트 문자열이 단순히 "테스트"이며 거의 모든 인코딩 체계에서 올바른 위치로 매핑된다는 점을 고려하여 명시 적으로 인코딩을 사용하도록 설정해야한다는 데 동의합니다. 이것이 결국 문제가 될 것이라고 생각하지 마십시오. (내가 말하는 것은 플랫폼의 기본 인코딩 체계가 어쨌든 "바닥"에 ASCII 문자 세트를 가질 가능성이 있으므로 "TEST"가 작동해야한다는 것입니다.) –

+0

예, 실제로 "US-ASCII"를 추가 할 필요가 없습니다. 여전히 잘 작동합니다. – zhoubo

관련 문제