我在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];
}
}
答案 0 :(得分:0)
input.read(buffer)
将阻止,直到收到数据。如果流已关闭,则会在您测试时返回-1
。但是,由于流仍处于打开状态并且正在等待数据到达,因此它将阻止。
既然你确实更新了你的问题,我会更新我的答案。关闭流与终止TCP会话不同。
关闭流会将连接放入FIN_WAIT_1
或FIN_WAIT_2
,并且需要完成并重置为完全关闭。您需要告诉服务器您正在关闭客户端然后关闭,或者告诉客户端您正在关闭服务器,然后关闭。基本上,双方在希望终止连接时需要关闭。根据您的环境,关闭也可能除了发布参考文献之外什么都不做。
在大多数低级套接字API的实现中,您有socket_shutdown(2)
实际发送FIN
TCP数据包以进行相互关闭启动。
基本上双方都需要关闭,否则连接将陷入等待状态。这是各种RFC中定义的行为。解释可以是found here。
在我关联的帖子中,您可以查看the diagram here。
答案 1 :(得分:0)
您正在读取流的结尾,但对等方尚未关闭连接。所以,你阻止。