我想通过套接字将UIImage的数据发送到服务器,所以我:
a)打开NSOutputStream
- (IBAction)send:(id)sender {
NSURL *website = [NSURL URLWithString:str_IP];
NSHost *host = [NSHost hostWithName:[website host]];
[NSStream getStreamsToHost:host port:1100 inputStream:nil outputStream:&oStream];
[oStream retain];
[oStream setDelegate:self];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream open];
}b)当空间可用时,将数据写入oStream
- (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) eventCode
{
switch(eventCode)
{
case NSStreamEventHasSpaceAvailable:
{
if(stream == oStream)
{
NSData *data = UIImageJPEGRepresentation(drawImage.image, 90);
//Convert from host to network endianness
uint32_t length = (uint32_t)htonl([data length]);
[oStream write:(uint8_t *)&length maxLength:4];
[oStream write:[data bytes] maxLength:length];
}
}
break;
}问题是数据一次又一次地写入oSream。当所有数据都已发送时,如何停止?
我在发送Image数据之前发送数据的长度,以便让服务器知道它何时到达末尾。是否必须更改服务器端的代码,以便在套接字到达末尾时将其关闭?我可以在哪里添加oStream close来关闭客户端的oStream?
发布于 2009-04-03 10:37:34
问题是数据一次又一次地写入oSream。当所有数据都已发送时,如何停止?
看,这就是用被动语态思考的危险。用主动语态改写疑问句:
问题是数据一次又一次地写入oSream。当我发送了所有的数据后如何停止它?
你几乎已经回答了你自己的问题。
很大一部分问题是您的HasSpaceAvailable处理程序造成的。下面是你正在做的事情:
这是三个问题,您需要解决这三个问题。
要执行所有这三项操作,请将长度放入NSMutableData中,并将JPEG表示形式附加到它的后面。然后,保留这个新的数据对象,并为字节指针和剩余长度提供额外的实例变量。在进入HasSpaceAvailable状态之前,您将完成所有这些操作。
然后,当您使用HasSpaceAvailable时,不要单独发送长度,因为您已经将其放入了数据对象中。你只需要从你的pointer实例变量中发送字节,长度保留为最大长度。检查发送的字节数不是0或-1 (参见the documentation)后,将其添加到指针并从剩余长度中减去它。
当剩余长度达到零时,您已经发送了所有内容。假设你不想跟上JPEG数据,然后你可以关闭流。
https://stackoverflow.com/questions/712810
复制相似问题