2011-03-15 3 views
1

약간의 클라이언트 - 서버 프로그램을 프로그래밍하고 있습니다. 서버가 Java 및 클라이언트 IOS에 있습니다. 서버에서는 java.net.ServerSocket을 사용하고 클라이언트에서는 LXSocket을 사용합니다. 클라이언트에서 서버로 데이터 (Integer, Double, Float, UTF8 String)를 보내는 것은 완벽하지만, UTF8 String을 Client로 다시 보내려고 할 때 실패합니다. 메시지를받을 수는 있지만 NSString으로 변환 할 수는 없습니다.Java - Objective C 소켓 UTF8 문제

자바 보내는 코드 :

public void sendMessage(java.net.Socket socket) throws IOException { 
    DataOutputStream stream = new DataOutputStream(socket.getOutputStream()); 
    int i = swabInt(64); 
    stream.writeInt(i); 
    String message = "Message to send as UTF8."; 
    int len = swabInt(message.length()); 
    stream.writeInt(len); 
    stream.write(nachricht.getBytes("UTF8")); 
} 

IOS 수신 번호 : 스트림을 수신

-(IBAction)createSocket { 
LXSocket *socket = [[[LXSocket alloc] init] autorelease]; 
[socket connect:@"localhost" port:11111]; 

int i = [socket readInt]; 
int len = [socket readInt]; 
NSData *data = [socket readBytesWithLength:len]; 
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 

작동하지만, 내가 그것을 충돌이 발생있는 NSString을 초기화하기 위해서 노력하고있을 때. 아이디어가 있으십니까?

편집

전송은 잘 작동하지만 난 이상한 뭔가를 발견했다. 이 코드 밖으로 시도 :

NSString *test = @"The Message"; 
    const char *c = [test UTF8String];` 
NSString *string = [[NSString alloc] initWithUTF8String:c]; 
NSLog(@"Decoding: %s", string); 

을하지만 내 콘솔은 말한다 :

2011-03-17 22:51:27.555 Sockets[8641:207] Decoding: ¿Ø‚ 

그래서 UTF8 인코딩이 문자 배열에서있는 NSString를 얻을 수있는 방법이 있습니까?

+0

왜 그렇게 낮은 수준이 될까요? 특별히 필요한 경우가 아니라면 표준 웹 컨테이너에서 간단한 웹 프레임 워크를 사용하는 것이 좋습니다. 그런 다음 XML 응답 (예 : RESTEasy 또는 XStream)을 제공하고 iOS 측에서 NSXMLParser를 사용합니다. 디버깅 (웹 브라우저 사용), 구성 (스레드 관리 등을 통한 Tomcat) 및 프로토콜 변경이 더 쉬워집니다. 필자는 클라이언트/서버 프로그램을 신속하게 작성하기 위해이 접근법을 사용했습니다. – WhiteFang34

+0

XML 응답이나 Webservices를 사용하려고 생각했지만 너무 느립니다. 나중에 메시지가 커지고 이미지와 같은 다른 데이터가 포함됩니다. –

+0

나는 당신의 질문에 답하기 위해'LXSocket'에 익숙하지 않지만, 당신은'message.length()'로 길이를 보냈다는 것을 알았다. 그것은 바이트 수 대신 문자 수를 반환합니다. getBytes ("UTF8")'에서 바이트의 길이를 리턴하고자 할 것이다. 지금 당장은 문제를 해결할 수 없지만 127 세가 넘는 문자를 보내려면 한 번만 문제가됩니다. – WhiteFang34

답변

2

오케이 전 일반 어리 ...

NSLog(@"%s", theString); 

대신

NSLog(@"%@", theString); 

에픽 실패 ...을 알아 냈다.