Swift iOS和Java套接字之间的TCP通信

我试图build立我的Java应用程序和相关(正在进行中的)iOS应用程序之间的通信。 打开套接字后,iOS应用程序(客户端)将“握手”string写入stream,然后等待读取stream(我认为)。 当代Java应用程序(服务器,在iOS应用程序之前启动)以成功的套接字打开并等待BufferedReader读取“握手”,此时这两个应用程序都被阻塞。 我不明白怎么可能?

按照iOS代码的一部分:

public class Client: NSObject, NSStreamDelegate { var serverAddress: CFString let serverPort: UInt32 = 50000 private var inputStream: NSInputStream! private var outputStream: NSOutputStream! private var connecting:Bool init(ip:String) { serverAddress = ip connecting = false super.init() connect() } func connect() { connecting = true while connecting { print("connecting...") var readStream: Unmanaged<CFReadStream>? var writeStream: Unmanaged<CFWriteStream>? CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream) // Documentation suggests readStream and writeStream can be assumed to // be non-nil. If you believe otherwise, you can test if either is nil // and implement whatever error-handling you wish. self.inputStream = readStream!.takeRetainedValue() self.outputStream = writeStream!.takeRetainedValue() self.inputStream.delegate = self self.outputStream.delegate = self self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.inputStream.open() self.outputStream.open() // send handshake let handshake: NSData = "handshake".dataUsingEncoding(NSUTF8StringEncoding)! let returnVal = self.outputStream.write(UnsafePointer<UInt8>(handshake.bytes), maxLength: handshake.length) print("written: \(returnVal)") // wait to receive handshake let bufferSize = 1024 var buffer = Array<UInt8>(count: bufferSize, repeatedValue: 0) print("waintig for handshake...") let bytesRead = inputStream.read(&buffer, maxLength: bufferSize) if bytesRead >= 0 { var output = NSString(bytes: &buffer, length: bytesRead, encoding: NSUTF8StringEncoding) print("received from host \(serverAddress): \(output)") } else { // Handle error } connecting = false self.inputStream.close() self.outputStream.close() } } public func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) { print("stream event") if stream === inputStream { switch eventCode { case NSStreamEvent.ErrorOccurred: print("input: ErrorOccurred: \(stream.streamError?.description)") case NSStreamEvent.OpenCompleted: print("input: OpenCompleted") case NSStreamEvent.HasBytesAvailable: print("input: HasBytesAvailable") // Here you can `read()` from `inputStream` default: break } } else if stream === outputStream { switch eventCode { case NSStreamEvent.ErrorOccurred: print("output: ErrorOccurred: \(stream.streamError?.description)") case NSStreamEvent.OpenCompleted: print("output: OpenCompleted") case NSStreamEvent.HasSpaceAvailable: print("output: HasSpaceAvailable") // Here you can write() to `outputStream` break default: break } } } 

}

遵循Java代码的一部分(它可以在使用相同Java应用程序的其他计算机之间完美地工作):

 public void run() { System.out.println("Server.java: waiting for connection"); //accept try { serverSocket = new ServerSocket(portNumber); clientSocket = serverSocket.accept(); reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); writer = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); System.out.println("Server.java: connected to " + clientSocket.getInetAddress()); // check for input request type String line = reader.readLine(); // <----BLOCKED HERE! if(line.equals("handshake")) { connected = true; // send acceptation System.out.println("Server.java: Sending handshake, waiting response"); writer.write("handshake"); writer.newLine(); writer.flush(); // .... and the rest of code... 

当我closuresiOS应用程序时,Java应用程序从读取中解锁,正确地打印收到的握手,然后继续他的工作。 有人可以帮我吗?

我认为你的问题是你永远不会在Swift程序结束行。

readLine根据BufferReader的文档来做什么:

“读取一行文本,换行符被换行符('\ n'),回车符('\ r')或回车符后立即换行。

这意味着它期望换行符或通信结束。 由于您的Swift应用程序不会发送任何新行字符,并且不closuresstream,客户端只是等待。

尝试换行('\ n')或回车('\ r'),看看它是如何去的。