InputStream读取字节在while循环时被触发

时间:2014-02-12 17:39:21

标签: java sockets serversocket

我在mac机器上运行套接字监听程序(eclipse),iOS客户端应用程序以字节格式向其发送图像。通常,Image字节为40 K及以上。 在socket中读取图像字节时,我遇到了一个奇怪的问题。我检查了很多链接,他们建议使用下面的代码来读取所有字节。问题是,它读取所有字节而不是来自'While'循环。读完所有字节后,只是在while循环内部进行了攻击。我不知道该怎么办?有人可以帮我解决这个问题吗?

InputStream input = socket.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();    
byte[] bufferr = new byte[1024];
int read = 0;
long numWritten = 0;
try { 
    // Tried both the below while conditions, both are giving same issue     
    // while ((read = input.read(bufferr, 0, bufferr.length)) != -1) 

    while ((read = input.read(bufferr)) > 0) {
        baos.write(bufferr, 0, read);

        numWritten += read;
        System.out.println("numWritten: " + numWritten);      
    }
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}  
try {
    baos.flush();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}   
byte[] data = baos.toByteArray();

以下是我的iOS代码。我正在关闭流,仍然是同样的问题。

    -(void) shareImage
{
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    UIGraphicsBeginImageContext(appDelegate.window.bounds.size);
    [appDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    NSData * data = UIImagePNGRepresentation(image);
    //[data writeToFile:@"screenshot.png" atomically:YES];

    NSLog(@"[data length] %i: ", [data length]);
    self.sentPing = YES;

    int num = [self.outputStream write:[data bytes] maxLength:([data length])];
    if (-1 == num) {
        NSLog(@"Error writing to stream %@: %@", self.outputStream, [self.outputStream streamError]);
    }else{
        NSLog(@"Wrote %i bytes to stream %@.", num, self.outputStream);
        [self.outputStream close];

        //NSTimer *myRegularTime = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(ShareNextScreen:) userInfo:nil repeats:NO];
    }

}

2 个答案:

答案 0 :(得分:0)

input.read(buffer)将阻止,直到收到数据。如果流已关闭,则会在您测试时返回-1。但是,由于流仍处于打开状态并且正在等待数据到达,因此它将阻止。

既然你确实更新了你的问题,我会更新我的答案。关闭流与终止TCP会话不同。

关闭流会将连接放入FIN_WAIT_1FIN_WAIT_2,并且需要完成并重置为完全关闭。您需要告诉服务器您正在关闭客户端然后关闭,或者告诉客户端您正在关闭服务器,然后关闭。基本上,双方在希望终止连接时需要关闭。根据您的环境,关闭也可能除了发布参考文献之外什么都不做。

在大多数低级套接字API的实现中,您有socket_shutdown(2)实际发送FIN TCP数据包以进行相互关闭启动。

基本上双方都需要关闭,否则连接将陷入等待状态。这是各种RFC中定义的行为。解释可以是found here

在我关联的帖子中,您可以查看the diagram here

答案 1 :(得分:0)

您正在读取流的结尾,但对等方尚未关闭连接。所以,你阻止。