Swift Network.framework Study 20191207「Server TCP」その3 receiveメソッド使用 改善
Study
Network.framework
Study:Server側
環境
Client:Java、NetBeans
Server:Swift、Xcode
Client Source Java
複数回送信する様に修正。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 10 | import Foundation import Network var networkServer = NetworkServer () networkServer . startListener () while networkServer . running { sleep ( 1 ) } |
NetworkServer.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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" ) } }) } } |