Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java到iOS客户端流读取垃圾字符_Java_Ios_Sockets_Encoding_Stream - Fatal编程技术网

Java到iOS客户端流读取垃圾字符

Java到iOS客户端流读取垃圾字符,java,ios,sockets,encoding,stream,Java,Ios,Sockets,Encoding,Stream,我正在开发一个iOS应用程序,它使用NSStreams和套接字与Java客户机对话 他们彼此交谈很好,但在iOS端,我经常注销接收字符串末尾的一些奇怪字符。另一方面,Java客户端似乎完全按照预期读取iOS应用程序发送的所有内容 垃圾字符的模式长度在5到30个字符之间,它们的模式看起来相当相似。它们总是包含许多倒置的问号 我已经包括了我的代码。有人知道我做错了什么,或者如何消除这些不需要的字符吗 - (void)stream:(NSStream *)theStream handleEvent:(

我正在开发一个iOS应用程序,它使用NSStreams和套接字与Java客户机对话

他们彼此交谈很好,但在iOS端,我经常注销接收字符串末尾的一些奇怪字符。另一方面,Java客户端似乎完全按照预期读取iOS应用程序发送的所有内容

垃圾字符的模式长度在5到30个字符之间,它们的模式看起来相当相似。它们总是包含许多倒置的问号

我已经包括了我的代码。有人知道我做错了什么,或者如何消除这些不需要的字符吗

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    switch (streamEvent) {
        case NSStreamEventHasBytesAvailable: {

            uint8_t buffer[100];
            [(NSInputStream *)theStream  read:buffer maxLength:sizeof(buffer)];
            NSString *s = [[NSString alloc] initWithBytes:buffer length:100 encoding:NSASCIIStringEncoding];
            if (s.length>1) {
                CLS_LOG(@"Read: %@",s);
                [self handleRecievedMessage:s];
            }
在Java服务器上

    DataOutputStream out;
    out = new DataOutputStream(socket.getOutputStream());
    byte[] msg = messageToSend.getBytes();
    out.write(msg);

您应该正确处理从流中实际读取的字符数。试着用这句话代替你的两行:

NSInteger len = [(NSInputStream *)theStream  read:buffer maxLength:sizeof(buffer)];
NSString *s = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

rmaddy说得对,问题是我从这条小溪里读了多少书。这是我现在使用的代码,它不再读取任何垃圾字符

- (void)readFromStream{
int BUFFER_LEN = 512;

uint8_t *buffer;
NSUInteger length;
BOOL freeBuffer = NO;
// The stream has data. Try to get its internal buffer instead of creating one
if(![inputStream getBuffer:&buffer length:&length]) {
    // The stream couldn't provide its internal buffer. We have to make one ourselves
    buffer = malloc(BUFFER_LEN * sizeof(uint8_t));
    freeBuffer = YES;
    NSInteger result = [inputStream read:buffer maxLength:BUFFER_LEN];
    length = result;
}

if (buffer != NULL) {
    NSString *s = [[NSString alloc] initWithBytes:buffer length:length encoding:NSASCIIStringEncoding];
    if (s.length>1) {
        CLS_LOG(@"Read: %@",s);
        [self handleRecievedMessage:s];
    }
}

// length bytes of data in buffer
if(freeBuffer) free(buffer);

}

为您的回答干杯。您正确地识别了问题。我已经发布了我正在使用的完整代码作为答案。