问题标签 [nsinputstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - NSInputStream 和 NSOutputStream 问题
我有两个NSInputStream
和NSOutputStream
之间通过网络相互连接的设备。当我在 中写入内容时output stream
,数据会一直写入,直到 NSStreamEventEndEncountered
事件发生。我关闭了输出流,但在另一边(input stream
)NSStreamEventEndEncountered
事件永远不会发生,直到我退出output stream
. 所以:
1. 为什么即使在相同的NSStreamEventEndEncountered
事件发生在之后,事件也没有发生?(在这个事件中甚至关闭了输出流)
2. 据我了解,一旦打开,您只能写入一次数据。不可能在事件后再次打开(例如在任何事件上写一些新的东西),对吗????input stream
output stream
NSOutputStream
output stream
NSStreamEventEndEncountered
ios - 通过 NSInputStream/NSOutputStream 传输多个图像
我有两个NSInputStream
并NSOutputStream
通过网络相互连接。我想将核心数据对象和相关图像从一台设备传输到另一台设备。我已成功将核心数据对象转换为JSON
并传输到流的另一端,然后从JSON
. 现在有与每个记录相关联的图像。图像在光盘上,只有路径存储在核心数据对象中。现在,当您写入output stream
. 我已经准备好了XML
(包含JSON
)。
1. 但是如何将图像 ( NSData *
) 与XML
(also NSData *
) 一起传输?我将如何在阅读端 ( NSInputStream
) 区分 XML 和图像?
2.另外,我要传输多张图片,最后我们如何判断NSInputStream
一张图片的字节已经完成,下一张图片的字节已经开始?
3.我们怎么知道哪个图像(名称)被转移了?
谢谢
ios - 如何使用 UTF-8 读取 NSInputStream?
我尝试使用 NSInputStream 在 iOS 中读取一个大文件,以用换行符分隔文件(我不想使用componentsSeparatedByCharactersInSet
,因为它使用了太多内存)。
但由于并非所有行似乎都是 UTF-8 编码的(因为它们可以显示为 ASCII,相同的字节)我经常收到Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
警告。
我的问题是:有没有办法通过设置编译器标志来抑制这个警告?
此外:附加/连接两个缓冲区读取是否保存,因为从字节流中读取,然后将缓冲区转换为字符串,然后附加字符串可能会使字符串损坏?
下面的示例方法演示了字节到字符串的转换将丢弃 UTF-8 字符的前半部分和后半部分,因为它是无效的。
输出:
ios - 排队进入 NSInputStream?
我想向 NSInputStream 添加三个“部分”:一个 NSString,另一个流的输出,然后是另一个 NSString。思路如下:
第一个和最后一个 NSString 表示 SOAP 请求的开始和结束,而流的输出是加载一个非常大的文件并将其编码为 Base64 字符串的结果。所以,最后我会让最终的 NSInputStream 保存整个 SOAP 请求,如下所示:
<soap开头> <Base64编码数据> <soap结尾>
我希望将整个请求保存在 NSInputStream 中的原因有两个:
- 我不会将非常大的数据文件加载到内存中
我认为这是强制以 HTTP 1.1 块发送最终请求的唯一方法(我需要这样做,因为否则,如果请求变得太大,服务器将不会接受它)。所以,我知道这样做:
/li>
确保请求将作为 HTTP 1.1 块发送,而不是作为一个巨大的原始 SOAP 请求发送。
所以,我想知道这是如何实现的——也就是说,我如何将事物“排队”到 NSInputStream 中?甚至可以做到吗?有替代方法吗?
仅供参考,在Java中可以按如下方式完成
因为 Java 有这些对象可用,但是 Objective-c 中的 NSStreams 看起来像非常低级的对象并且很难使用。
注意:我完全重写了两天前提出的原始问题,因为我认为新的编辑更清楚地解释了问题所在。我希望它会帮助它更容易理解并回答
更新 2
到目前为止,这是我能够实现的目标:我没有尝试加入流,而是使用临时文件先写入 <soap beginning>,然后设置输入流以从文件中读取块,将每个块编码为 Base64 字符串并将其写入同一个临时文件,最后,当我的流关闭时,我将 <soap ending> 写入临时文件。然后我用这个文件的内容设置了另一个输入流,我将它传递给 NSMutableURLRequest:
这确保了文件内容的 HTTP 1.1 分块传输。连接完成后,删除临时文件。
这似乎工作正常,但当然这是一个烦人的工作。我不想写一个临时文件,因为它本来可以由流处理(理想情况下。)如果有人还有更好的建议,请告诉我:)
更新 3
好的,另一个更新是为了。虽然我的文件写入似乎有效,但我现在遇到了一个意外问题,我的一些请求无法上传到服务器。具体来说,一切都按计划进行,我正在将临时文件的内容读入一个流,并将我的请求的 HTTP 主体设置为这个流,它开始按照我的意愿传输 HTTP 1.1 块 - 但对于一些一些数据包被丢弃并且最终请求 - 这是我的猜测 - 格式错误并因此失败的原因。我认为丢弃数据包的问题是随机的,因为我在较大的请求中观察到它 - 也就是说,这个问题有更多的机会出现 - 而我的较小的请求通常会很好。这当然是与该问题中的原始问题不同的问题。如果有人知道可能导致这种情况的原因,在 NSURLConnection 发送的分块 HTTP 1.1 请求期间丢弃的数据包
ios - NSInputStream stops running, sometimes throws EXC_BAD_ACCESS
(UPDATED) this is the problem in a nutshell: in iOS I want to read a large file, do some processing on it (in this particular case encode as Base64 string() and save to a temp file on the device. I set up an NSInputStream to read from a file, then in
I'm doing most of the work. For some reason, sometimes I can see the NSInputStream just stops working. I know because I have a line
in the beginning of (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
and sometimes I would just see the output
(which corresponds to the event NSStreamEventHasBytesAvailable) and then nothing afterwards. Not event 10, which corresponds to NSStreamEventEndEncountered, not an error event, nothing! And also sometimes I even get a EXC_BAD_ACCESS exception which I have no idea at the moment how to debug. Any help would be appreciated.
Here is the implementation. Everything starts when I hit a "submit" button, which triggers:
Here is sendData:
Here is setUpStreamsForInputFile called above:
Finally, this is where most logic occurs:
Note: when I posted this first, I was under a wrong impression the issue had something to do with using GCD. As per Rob's answer below I removed the GCD code and the issue persists.
ios - 尝试使用 GCDAsyncSocket 进行缓冲传输
(更新)我正在尝试读取一个大文件(视频或图片)并通过 SOAP 请求将其发送到远程服务器。我需要将数据编码为 Base64 字符串。我正在尝试按以下方式执行此操作:
为将“绕过”base64 编码数据的 SOAP 请求创建一个模板 xml
将 SOAP xml 的第一部分推入缓冲区
打开视频文件并将其编码为块并将每个编码的块推入缓冲区
最后,推送 SOAP xml 的第二部分
为了能够将上述部分“排队”,我正在尝试使用具有缓冲功能的 GCDAsyncSocket。我认为由于 GCDAsyncSocket 在 TCP 级别上运行,我需要自己编写 HTTP POST 标头。所以,有很多我只是模糊理解的活动部分,我可能做错了。但我的插座似乎从来没有起飞,我什至不知道如何调试它。这是我的相关代码,试试看你是否发现任何明显的错误:
套接字似乎总是可以正常连接,我看到使用这个委托方法:
setUpStreamsForInputFile 方法(在上面的第一个代码清单中调用):
现在,前一个方法中的 NSInputStream 设置将向这个委托发送事件:
套接字应该使用此委托将内容输出到日志
但这是随机发生的。例如,有时我看到前 2 个 if 被调用,有时却没有。当我这样做并且它到达第三个“如果”(我正在写入实际编码数据的那个)时,它只写入了 2 或 3 次,仅此而已 - 考虑到文件的大小,我认为次数太少了。我从来没有看到它到达最后一个“if”,它应该写 SOAP xml 的最后一部分。将不胜感激任何帮助!提前致谢。
进一步更新 (3/19/13)
今天测试套接字时,我根本不再收到写入事件,这告诉我它是随机的,我做错了什么。今天连接打开,但在某个时候超时,正如我使用以下委托方法所看到的:
返回
socketDidDisconnect:withError: "错误域=NSPOSIXErrorDomain Code=60 "操作超时" UserInfo=0x1cd89b00 {NSLocalizedFailureReason=connect() 函数出错,NSLocalizedDescription=操作超时}"
虽然我仍在上面的流委托中运行 Base64 数据的写入。
objective-c - NSSreamstatus 是否我正在获取数据
我有 NSInputStream,我想检查我是否从另一端获取数据,我读取了 NSStreamStatus,我发现“NSStreamStatusReading”用于检查读取的数据。
我试图检查该状态,但它不起作用任何人都可以告诉我如何检查我是否正在获取数据..代码:
}
它在发送时工作,但当我停止服务器时,它没有更新。
ios - 子类化 NSInputStream 以从本地文件路径上传特定部分的数据
我在一个文件中有 100 MB 的数据。这 100 mb 的数据将被虚拟分割。即,我需要创建一个指向不同 5MB 块的 NSInputStream。这可以通过使用 NSData 创建流来实现。
但是我想知道我是否可以拥有一个指向文件中数据范围的 NSInputStream ?
ios - iOS: outputStream does not stay open
Okay so I'm implementing a NSOutput and Input Streams. When they are initialized, the streams open and connect to my TCPServer I have running on my PC, but then appear to close once outside of the initializing function or maybe the streams aren't being stored properly. I'm not quite sure so any assistance is greatly appreciated
In my .h file:
In my .m file:
In the initNetworkConnection the simulator connects to my TCPServer and opens a connection(streamstatus = 2). Receives the message "Hello from Ipad Simulator". But then I have the "sendaResponse" method called from a button click which then streamstatus = 0 and "outputstream" doesn't appear to be initialized. Am I just not retaining the variable properly?
ios - NSInputStream - 在不使用 NSMutable 数据追加的情况下追加数据
我想在不使用 NSMutable 数据追加的情况下在 NSInputStream 中追加数据。
有可能做到吗?
请指导我