这是我第一次问这么愚蠢的借口。
我正在编写一个应用程序,它也在Android和IOS上。客户端都与我用Java编码的服务器通信。与android的通信非常简单,我已经完成了那一面。
现在我来到了IOS方面,我遇到了一个问题。
我正在使用PrintWriter写入Server上的OutputStream。在IOS客户端,我使用此代码与服务器通信 `
import Foundation
class Connection: NSObject, StreamDelegate {
let host = ""
let port = 1111
var inputStream: InputStream?
var outputStream: OutputStream?
var name = ""
var messageReceived = ""
func connect() {
Stream.getStreamsToHost(withName: self.host, port: self.port, inputStream: &inputStream, outputStream: &outputStream)
if inputStream != nil && outputStream != nil {
// Set delegate
inputStream!.delegate = self
outputStream!.delegate = self
// Schedule
inputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)
outputStream!.schedule(in: .main, forMode: RunLoopMode.defaultRunLoopMode)
print("Start open()")
// Open!
inputStream!.open()
outputStream!.open()
}
}
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case Stream.Event.errorOccurred:
print("input: ErrorOccurred:)")
break
case Stream.Event.openCompleted:
print("input: OpenCompleted")
break
case Stream.Event.hasBytesAvailable:
if (getResponse(length: 4) == "new\r\n") {
print("yup")
messageReceived = getResponse(length: 1)
if (messageReceived == "yes\r\n") {
print("asd")
}else if (messageReceived == "nos\r\n") {
print("sqrwe")
}else {
print(messageReceived)
}
}
print("input: HasBytesAvailable")
break
case Stream.Event.errorOccurred:
print("output: ErrorOccurred:)")
break
case Stream.Event.hasSpaceAvailable:
if name == "" {
sendMessage(message: "super")
name = "super"
}
print("output: HasSpaceAvailable")
break
// Here you can write() to `outputStream`
default:
break
}
}
func sendMessage(message: String) {
let anotherString = message + "\r\n"
let encodedDataArray = [UInt8](anotherString.utf8)
outputStream?.write(encodedDataArray, maxLength: encodedDataArray.count)
}
func getResponse(length: Int)-> String {
var buffer = [UInt8](repeating: 0, count: length)
var bytes = inputStream?.read(&buffer, maxLength: length)
let data = NSMutableData(bytes: &buffer, length: bytes!)
let read = inputStream!.read(&buffer, maxLength: length)
bytes! += read
data.append(&buffer, length: read)
var str:NSString! = ""
str = NSString(bytes: data.bytes, length: bytes!, encoding: String.Encoding.utf8.rawValue)
return str as String
}
func getRespond() -> Int {
var buffer = [UInt8](repeating: 0, count: 1)
var bytes = inputStream?.read(&buffer, maxLength: 1)
let data = NSMutableData(bytes: &buffer, length: bytes!)
let read = inputStream!.read(&buffer, maxLength: 1)
bytes! += read
data.append(&buffer, length: read)
var str:NSString! = ""
str = NSString(bytes: data.bytes, length: bytes!, encoding: String.Encoding.utf8.rawValue)
if let i = Int(str as String) {
return i;
}
return 0
}
}
我实现了getResponse函数,该函数取决于调用中提供的长度,而getResponse只接收Integer值。我必须这样做,因为每当我尝试使用长度为1024的缓冲区(例如)时,IOS客户端将挂起并等待服务器关闭连接或发送那么多字符(1024)。
我想知道是否有一种方法可以在服务器和客户端之间进行通信而无需提供消息长度。 我已经尝试从服务器端刷新流,显然,除非被覆盖,否则它不会执行它的意思。我甚至尝试使用BufferedOutputStream而不是PrintWriter来写入字节然后刷新。依然没有。