Преглед изворни кода

Add collect (client streaming) and expand (server streaming) methods to Swift Echo server.

Tim Burks пре 9 година
родитељ
комит
7183c257d3

+ 126 - 4
Examples/Echo/Swift/Echo/EchoServer.swift

@@ -32,7 +32,9 @@
  */
 import Foundation
 import gRPC
+import Darwin // for sleep()
 
+// nonstreaming
 class EchoGetSession : Session {
   var handler : Handler
   var server : EchoGetServer
@@ -61,6 +63,82 @@ class EchoGetSession : Session {
   }
 }
 
+// server streaming
+class EchoExpandSession : Session {
+  var handler : Handler
+  var server : EchoExpandServer
+
+  init(handler:Handler, server: EchoExpandServer) {
+    self.handler = handler
+    self.server = server
+  }
+
+  func sendMessage(message:Echo_EchoResponse) -> Void {
+    try! handler.sendResponse(message:message.serializeProtobuf()) {}
+  }
+
+  func run() {
+    do {
+      try handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
+        if let requestData = requestData {
+          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+          self.server.handle(session: self, message:requestMessage)
+        }
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}
+
+// client streaming
+class EchoCollectSession : Session {
+  var handler : Handler
+  var server : EchoCollectServer
+
+  init(handler:Handler, server: EchoCollectServer) {
+    self.handler = handler
+    self.server = server
+  }
+
+  func sendMessage(message:Echo_EchoResponse) -> Void {
+    try! self.handler.sendResponse(message:message.serializeProtobuf(),
+                                   statusCode: 0,
+                                   statusMessage: "OK",
+                                   trailingMetadata: Metadata())
+  }
+
+  func waitForMessage() {
+    do {
+      try handler.receiveMessage() {(requestData) in
+        if let requestData = requestData {
+
+          let requestMessage = try! Echo_EchoRequest(protobuf:requestData)
+          self.waitForMessage()
+          self.server.handle(session:self, message:requestMessage)
+
+        } else {
+          // if we get an empty message (requestData == nil), we close the connection
+          self.server.close(session:self)
+        }
+      }
+    } catch (let error) {
+      print(error)
+    }
+  }
+
+  func run() {
+    do {
+      try self.handler.sendMetadata(initialMetadata:Metadata()) {
+        self.waitForMessage()
+      }
+    } catch (let callError) {
+      print("grpc error: \(callError)")
+    }
+  }
+}
+
+// fully streaming
 class EchoUpdateSession : Session {
   var handler : Handler
   var server : EchoUpdateServer
@@ -142,7 +220,19 @@ class EchoServer {
         handler.session.run()
       }
 
-      if (handler.method == "/echo.Echo/Update") {
+      else if (handler.method == "/echo.Echo/Expand") {
+        handler.session = EchoExpandSession(handler:handler,
+                                         server:EchoExpandServer())
+        handler.session.run()
+      }
+
+      else if (handler.method == "/echo.Echo/Collect") {
+        handler.session = EchoCollectSession(handler:handler,
+                                         server:EchoCollectServer())
+        handler.session.run()
+      }
+
+      else if (handler.method == "/echo.Echo/Update") {
         handler.session = EchoUpdateSession(handler:handler,
                                             server:EchoUpdateServer())
         handler.session.run()
@@ -158,19 +248,51 @@ class EchoGetServer {
 
   func handle(message:Echo_EchoRequest) -> Echo_EchoResponse? {
     var reply = Echo_EchoResponse()
-    reply.text = "Swift nonstreaming echo " + message.text
+    reply.text = "Swift echo get: " + message.text
     return reply
   }
+}
+
+class EchoExpandServer {
+
+  func handle(session:EchoExpandSession, message:Echo_EchoRequest) -> Void {
+    let parts = message.text.components(separatedBy: " ")
+    var i = 0
+    for part in parts {
+      var reply = Echo_EchoResponse()
+      reply.text = "Swift echo expand (\(i)): \(part)"
+      session.sendMessage(message:reply)
+      i += 1
+      sleep(1)
+    }
+  }
+}
+
+class EchoCollectServer {
+  var result = ""
+
+  func handle(session:EchoCollectSession, message:Echo_EchoRequest) -> Void {
+    if result != "" {
+      result += " "
+    }
+    result += message.text
+  }
 
+  func close(session:EchoCollectSession) {
+    var reply = Echo_EchoResponse()
+    reply.text = "Swift echo collect: " + result
+    session.sendMessage(message:reply)
+  }
 }
 
 class EchoUpdateServer {
+  var i = 0
 
   func handle(session:EchoUpdateSession, message:Echo_EchoRequest) -> Void {
     var reply = Echo_EchoResponse()
-    reply.text = "Swift streaming echo " + message.text
+    reply.text = "Swift echo update (\(i)): \(message.text)"
     session.sendMessage(message:reply)
+    i += 1
   }
-  
 }
 

+ 2 - 0
Examples/Echo/Swift/Echo/EchoViewController.swift

@@ -73,6 +73,8 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
         print(error)
       }
     }
+    // invalidate the service
+    service = nil
   }
 
   @IBAction func buttonValueChanged(sender: NSSegmentedControl) {