- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在处理流事件时遇到问题。我有一个客户端应用程序,它通过 TCP 连接到服务器并不断从服务器接收 JSON 数据。
到目前为止,我是这样创建流的:
// Create Stream
var readStream : Unmanaged<CFReadStream>?
var writeStream : Unmanaged<CFWriteStream>?
let host : CFString = NSString(string: serverUrl!)
let port : UInt32 = UInt32(serverPort)
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream)
inputStream = readStream!.takeUnretainedValue()
outputStream = writeStream!.takeRetainedValue()
inputStream!.delegate = self
outputStream!.delegate = self
inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream!.open()
outputStream!.open()
// Send Authentication Data
let uid = 1000000000 + arc4random() % 2000000000
let joinRoomMsg : NSData = "{\"roomid\": \(realRoomID!), \"uid\": \(uid)}".dataUsingEncoding(NSUTF8StringEncoding)!
sendSocketData(outputStream!, totalLength: joinRoomMsg.length + 16, headerLength: 16, protocolVersion: 1, action: 7, param5: 1, data: joinRoomMsg)
这里是sendSocketData
函数:
func sendSocketData(outputStream: NSOutputStream, totalLength: Int32, headerLength: CShort, protocolVersion: CShort, action: Int32, param5: Int32, data: NSData?) {
var totalLengthBE = totalLength.bigEndian
var headerLengthBE = headerLength.bigEndian
var protocolVersionBE = protocolVersion.bigEndian
var actionBE = action.bigEndian
var param5BE = param5.bigEndian
withUnsafePointers(&totalLengthBE, &headerLengthBE, &protocolVersionBE) {
outputStream.write(UnsafePointer($0), maxLength: sizeofValue(totalLengthBE))
outputStream.write(UnsafePointer($1), maxLength: sizeofValue(headerLengthBE))
outputStream.write(UnsafePointer($2), maxLength: sizeofValue(protocolVersionBE))
}
withUnsafePointers(&actionBE, ¶m5BE) {
outputStream.write(UnsafePointer($0), maxLength: sizeofValue(actionBE))
outputStream.write(UnsafePointer($1), maxLength: sizeofValue(param5BE))
}
if data != nil {
outputStream.write(UnsafePointer(data!.bytes), maxLength: data!.length)
}
}
处理:
func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
if aStream === inputStream {
switch eventCode {
case NSStreamEvent.ErrorOccurred:
print("iStream ErrorOccurred")
case NSStreamEvent.EndEncountered:
print("iStream EndEncountered")
case NSStreamEvent.OpenCompleted:
print("iStream Opened")
case NSStreamEvent.HasBytesAvailable:
print("Stream HasBytesAvailable")
// read data here...
default:
print("iStream Unknow")
}
} else if aStream === outputStream {
switch eventCode {
case NSStreamEvent.OpenCompleted:
print("oStream Opened")
case NSStreamEvent.ErrorOccurred:
print("oStream ErrorOccurred")
case NSStreamEvent.HasSpaceAvailable:
print("oStream HasSpaceAvailable")
default:
print("oStream Unknow")
}
}
}
服务器确实将 JSON 数据发回给我。
现在我应该能够使用 eventCode NSStreamEvent.HasBytesAvailable
从 inputStream 读取数据。
但问题是:流事件处理程序向我发送了 NSStreamEvent.HsaSpaceAvailable
并卡在此处。 inputStream.hasBytesAvailable
返回 false
并且我无法读取任何内容。
If the delegate receives an
NSStreamEvent.HasSpaceAvailable
event and does not write anything to the stream, it does not receive further space-available events from the run loop until theNSOutputStream
object receives more bytes. When this happens, the run loop is restarted for space-available events.
但是我没有数据可以再写入流。
我确实尝试向其中写入一些随机数据,但没有成功。我还尝试在 outputStream.hasSpaceAvailable
返回 true
后发送身份验证数据,但它也什么也没做。
我的代码有问题吗?
最佳答案
我终于意识到 stream() 函数不起作用只是因为该函数的签名不正确/已过时。
这是您正在使用的:
func stream(aStream: Stream, handleEvent eventCode: Stream.Event)
但实际上应该是:
func stream(_ aStream: Stream, handle eventCode: Stream.Event)
关于swift - 停留在 hasSpaceAvailable 并且无法从 NSInputStream 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882946/
我正在尝试将输入流转换为字符串。我尝试转换的输入流是 NSURLRequest.HTTPBodyStream,显然 httpbody 设置为 null 并在您发出请求后替换为流。我该怎么做呢?这是我目
我在使用 NSInputStream 时遇到问题。我有连接到服务器的客户端应用程序,然后服务器将开始通过 TCP 每秒大约 1 条消息重复向我的客户端应用程序发送消息。服务器只是向客户端广播消息,消息
我正在尝试创建一个简单的iPhone应用程序,它可以与服务器通信(目前正在我的计算机上运行并且工作正常)。我一直在尝试使用 NSStream 类,但遇到了很多问题。我真的只是想使用流来模拟 telne
是否有办法查看 nsinputstream 中的值,例如将其转换为字符串? 最佳答案 我假设您指的是从 NSInputStream 返回的数据: - (NSInteger)read:(uint8_t
我的应用程序使用 NSInputStream,如下所示: inputStream.delegate = self; [inputStream scheduleInRunLoop:[NSRunLoop
在我的应用程序中,我使用 NSStreams 进行客户端服务器通信。在事件 hasbytesAvailable 的 delegate 方法中,当我读取数据时返回 null 案例:当长度为4096时读取
当我从服务器接收数据时出现错误(数据只是字符串)。 例如 服务器发送数据(15000字节) 我的 iPhone 收到数据(7878 字节) 所以我尝试搜索,我知道方法是答案。 但我无法应用我的代码..
我正在尝试使用 NSInputStream 通过 TCP 套接字连接接收数据。在服务器端,我先发送数据大小,然后再发送数据本身。在 iOS 客户端,我需要从 NSInputStream 中提取前 4
请帮助我,我快疯了。我需要创建一个 NSInputStream,这样我就可以通过 wifi 从摄像头读取实时预览。liveViewStream 是一个 NSInputStream-Instance-V
我正在将一个 java 客户端移植到 iphone,我一直在想是否有一个围绕 NSInputStream 的包装器来从停止在指定分隔符处的流中读取字符串?我正在考虑类似 Javas Scanner 类
我想向 NSInputStream 添加三个“部分”:一个 NSString,另一个流的输出,然后是另一个 NSString。思路如下: 第一个和最后一个 NSString 代表 SOAP 请求的开始
全部, 我有一台服务器,它有一个用于通信的 TCP 套接字流。我需要访问该流并读取它需要发送给我的初始数据。 我目前的代码如下。老实说,我对此完全视而不见。我不确定这是否正确,更不用说适合这项工作了。
我正在尝试通过 NSInputStream 从我的文档目录中读取自定义文件,以将其上传到 FTP 服务器。我使用的代码与 SimpleFTPSample 中演示的代码完全相同由苹果公司提供。只要文件为
嘿伙计们,我正在从网络服务器上下载一个 yaml 文件。我的 NSInputStream 与本地 yaml 文件配合得很好(使用 file://filename.yaml url 方案) 以下是相关代
我正在尝试打断 [NSOutputstream write] 当连接丢失时。 但是,即使我使用 关闭流,它似乎仍然继续阻塞 [NSOutputstream close]. 我想要实现的只是在服务器连接
我需要使用 Windows 1252 编码将图像流式传输到 .NET 后端服务。所以我相信我需要创建一个 NSURLRequest 并将其 HTTPBodyStream 设置为使用图像数据创建的 NS
我有 openssl 服务器和 Objective-C 客户端。我这样发消息 uint32_t testD = 161; err = SSL_write(ssl_, &testD, sizeof(ui
我正在从服务器按顺序获取 NSData block ,超过大约。 4096 字节,按顺序。每个接收到的 block 的大小可能不同。 我想做的是将所有这些字节附加到某处,同时从数据的开头开始读取,顺序
我在一个文件中有 100 MB 的数据。这 100 mb 数据将被虚拟地划分。即,我需要创建一个指向不同 5MB block 的 NSInputStream。这可以通过使用 NSData 创建流来实现
我想将 NSInputStream 传递给 MPMoviePlayerController、MPMoviePlayerViewController 或其他任何东西。 输入流利用了 Apple 框架不支
我是一名优秀的程序员,十分优秀!