2012-06-02 2 views
2

커스텀 코코아 애플리케이션 (물론 objective-c로 작성)에서 미니 크래프트 서버에 패킷을 보내려고했습니다. 나는 그것을 어떻게하는 지 조금은 혼란 스럽다. 나는 자바로 해냈다. 그것은 아주 쉬웠다. 이렇게하는 것은 객관적입니다.하지만 좀 더 도전적인 것으로 입증되고 있습니다.Minecraft 서버에 패킷 보내기 : 목표 c

- (void)handshake 
{ 
    PacketHandshake *packet = [PacketHandshake packetString:[NSString stringWithFormat:@"%@;%@:%i", username, IP, PORT]]; 
    [packet writeData:dataOut]; 
} 

호출 :

내가 사용하고있는 코드입니다 내가 미리 서버에 성공적으로 연결을 설정

- (void)writeData:(NSOutputStream *)dataOut 
{ 
    [super writeData:dataOut]; //Writes the "header" which is a char with the value of 0x02 (char packetID = 0x02) 
    NSUInteger len = [string lengthOfBytesUsingEncoding:NSUTF16BigEndianStringEncoding]; //Getting the length of the string i guess? 
    NSData *data = [string dataUsingEncoding:NSUTF16BigEndianStringEncoding]; //Getting string bytes? 
    [dataOut write:(uint8_t*)len maxLength:2]; //Send the length? 
    [dataOut write:[data bytes] maxLength:[data length]]; //Send the actual string? 
} 

,하지만 난 정말 모르는 여부 패킷을 올바르게 보내지 않습니다. 누군가가 다양한 데이터 유형과 객체를 어떻게 보내야하는지 설명해주십시오. (int, byte/char, short, double, NSString, BOOL/bool)

또한 Minecraft에서 요구하는 것과 같은 패킷을 보낼 수있는 특정 또는 보편적 인 방법이 있습니까?

좋아, 지금 질문 : 데이터 유형, 주로 문자열이 Java 및 Objective-C와 어떻게 관련되어 있습니까?

도움을 주시면 감사하겠습니다. 감사합니다.

아무도 모릅니다.

답변

1

아마도 네트워크/호스트 바이트 순서 문제가 발생하고 있습니까? Minecraft에 대해서는 거의 알지 못하지만, Minecraft 프로토콜의 단락은 빅 엔디안 인 네트워크 바이트 순서를 사용합니다 (다른 모든 데이터 유형은 1 바이트이므로 엔디안이 적절하지 않습니다). 모든 x86 시스템은 리틀 엔디안을 사용합니다.

하지 당신이 SYS/types.h 및 netinet을 포함해야 거라고하는 C 라이브러리 함수 ntohs()htons()를 사용할 수있는 경우 PacketHandshake 클래스 - 그것을 보내기 전에 데이터를 변환할지 여부를 모르겠어요 /in.h 링크는 또한 문자열이 0x20s로 채워진 표준 ASCII 문자의 64 바이트 배열임을 언급합니다. [string UTF8String]을 수행하여 NSString에서 ASCII 값을 가져올 수 있습니다. const char* 즉 0x0으로 끝나는 표준 C 문자열을 반환 한 다음 입력 할 수 있습니다. 그러나 Java에서 작동하는 경우에는 필요하지 않을 수도 있습니다.