Swift Network.framework Study 20191207「Server TCP」その3 receiveメソッド使用 改善
Study
Network.framework
Study:Server側
環境
Client:Java、NetBeans
Server:Swift、Xcode
Client Source Java
複数回送信する様に修正。
package example.java.network; import java.io.PrintWriter; import java.net.Socket; public class ExampleClientSocket { public static void main(String[] args) { try(Socket socket = new Socket("localhost", 7777); PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);) { for(int i = 0; i < 5; i++) { printWriter.println("Example Send Data"); Thread.sleep(5000); } } catch(Exception e) { System.out.println(e); } } }
Server Source Swift
NWListerを使用する
コネクション確立後のNWConnectionに受信処理登録、開始実施
受信バイト数指定出来るreceiveメソッド使用。
受信したデータ1回分から、maximumLength数分取得しました。
下記の例だと5バイト。
5バイト以上を送信したとしても、6バイト目以降を連続して受信がコールされるわけではない様です。
自ら受信をコールする必要がある。
receiveメソッドを受信完了までコールする。
completionの受信データがnil以外、完了フラグがfalse時にreceiveメソッドをコール。
main.swift
import Foundation import Network var networkServer = NetworkServer() networkServer.startListener() while networkServer.running { sleep(1) }
NetworkServer.swift
import Foundation import Network class NetworkServer { public var running = true func startListener() { let myQueue = DispatchQueue(label: "ExampleNetwork") do { let nWListener = try NWListener(using: .tcp, on: 7777) nWListener.newConnectionHandler = { (newConnection) in print("New Connection!!") newConnection.start(queue: myQueue) self.receive(nWConnection: newConnection) } nWListener.start(queue: myQueue) print("start") } catch { print(error) } } func receive(nWConnection:NWConnection) { nWConnection.receive(minimumIncompleteLength: 1, maximumLength: 5, completion: { (data, context, flag, error) in print("receiveMessage") if let data = data { let receiveData = [UInt8](data) print(receiveData) print(flag) if(flag == false) { self.receive(nWConnection: nWConnection) } } else { print("receiveMessage data nil") } }) } }