Browse Source

Refactor EchoServer into standalone class.

Tim Burks 9 years ago
parent
commit
fc5044eee4

+ 4 - 0
Examples/Echo/Swift/Echo.xcodeproj/project.pbxproj

@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		D324A6021D81CF8F00421B59 /* EchoServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D324A6011D81CF8F00421B59 /* EchoServer.swift */; };
 		D35C9FAC1D74B079000443CD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D35C9FAB1D74B079000443CD /* AppDelegate.swift */; };
 		D35C9FAE1D74B079000443CD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D35C9FAD1D74B079000443CD /* Assets.xcassets */; };
 		D35C9FB11D74B079000443CD /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D35C9FAF1D74B079000443CD /* MainMenu.xib */; };
@@ -55,6 +56,7 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+		D324A6011D81CF8F00421B59 /* EchoServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EchoServer.swift; sourceTree = "<group>"; };
 		D35C9FA81D74B079000443CD /* Echo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Echo.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		D35C9FAB1D74B079000443CD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		D35C9FAD1D74B079000443CD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -106,6 +108,7 @@
 				D35C9FAF1D74B079000443CD /* MainMenu.xib */,
 				D35C9FB21D74B079000443CD /* Info.plist */,
 				D35C9FC71D74B0C1000443CD /* EchoViewController.swift */,
+				D324A6011D81CF8F00421B59 /* EchoServer.swift */,
 			);
 			path = Echo;
 			sourceTree = "<group>";
@@ -236,6 +239,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D324A6021D81CF8F00421B59 /* EchoServer.swift in Sources */,
 				D35C9FC81D74B0C1000443CD /* EchoViewController.swift in Sources */,
 				D35C9FAC1D74B079000443CD /* AppDelegate.swift in Sources */,
 			);

+ 4 - 79
Examples/Echo/Swift/Echo/AppDelegate.swift

@@ -39,87 +39,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {
 
   @IBOutlet weak var window: NSWindow!
 
+  var echoServer: EchoServer!
+
   func applicationDidFinishLaunching(_ aNotification: Notification) {
     gRPC.initialize()
-    startServer(address:"localhost:8081")
-  }
-
-  func startServer(address:String) {
-    let fileDescriptorSet = FileDescriptorSet(filename:"echo.out")
-    print("Server Starting")
-    print("GRPC version " + gRPC.version())
-
-    let server = gRPC.Server(address:address)
-
-    server.run {(requestHandler) in
-      print("Received request to " + requestHandler.host()
-        + " calling " + requestHandler.method()
-        + " from " + requestHandler.caller())
-
-      // NONSTREAMING
-      if (requestHandler.method() == "/echo.Echo/Get") {
-        requestHandler.receiveMessage(initialMetadata:Metadata())
-        {(requestBuffer) in
-          if let requestBuffer = requestBuffer,
-            let requestMessage =
-            fileDescriptorSet.readMessage(name:"EchoRequest",
-                                          proto:requestBuffer.data()) {
-            requestMessage.forOneField(name:"text") {(field) in
-              let replyMessage = fileDescriptorSet.createMessage(name:"EchoResponse")!
-              replyMessage.addField(name:"text", value:"Swift nonstreaming echo " + field.string())
-              requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize()),
-                                          trailingMetadata:Metadata())
-            }
-          }
-        }
-      }
-
-      // STREAMING
-      if (requestHandler.method() == "/echo.Echo/Update") {
-        requestHandler.sendMetadata(
-          initialMetadata: Metadata(),
-          completion: {
-
-            self.handleMessage(
-              fileDescriptorSet: fileDescriptorSet,
-              requestHandler: requestHandler)
-
-            // we seem to never get this, but I'm told it's what we're supposed to do
-            requestHandler.receiveClose() {
-              requestHandler.sendStatus(trailingMetadata: Metadata(), completion: {
-                print("status sent")
-                requestHandler.shutdown()
-              })
-            }
-          }
-        )
-
-      }
-    }
-  }
 
-  func handleMessage(fileDescriptorSet: FileDescriptorSet,
-                     requestHandler: Handler) {
-    requestHandler.receiveMessage()
-      {(requestBuffer) in
-        if let requestBuffer = requestBuffer,
-          let requestMessage = fileDescriptorSet.readMessage(name:"EchoRequest",
-                                                             proto:requestBuffer.data()) {
-          requestMessage.forOneField(name:"text") {(field) in
-            let replyMessage = fileDescriptorSet.createMessage(name:"EchoResponse")!
-            replyMessage.addField(name:"text", value:"Swift streaming echo " + field.string())
-            requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize())) {
-              // after we've sent our response, prepare to handle another message
-              self.handleMessage(fileDescriptorSet:fileDescriptorSet, requestHandler:requestHandler)
-            }
-          }
-        } else {
-          // if we get an empty message (nil buffer), we close the connection
-          requestHandler.sendStatus(trailingMetadata: Metadata(), completion: {
-            print("status sent")
-            requestHandler.shutdown()
-          })
-        }
-    }
+    self.echoServer = EchoServer(address:"localhost:8081")
+    echoServer.start()
   }
 }

+ 97 - 0
Examples/Echo/Swift/Echo/EchoServer.swift

@@ -0,0 +1,97 @@
+//
+//  EchoServer.swift
+//  Echo
+//
+//  Created by Tim Burks on 9/8/16.
+//  Copyright © 2016 Google. All rights reserved.
+//
+
+import Foundation
+import gRPC
+import QuickProto
+
+class EchoServer {
+  private var address: String
+
+  init(address:String) {
+    self.address = address
+  }
+
+  func start() {
+    let fileDescriptorSet = FileDescriptorSet(filename:"echo.out")
+    print("Server Starting")
+    print("GRPC version " + gRPC.version())
+
+    let server = gRPC.Server(address:address)
+
+    server.run {(requestHandler) in
+      print("Received request to " + requestHandler.host()
+        + " calling " + requestHandler.method()
+        + " from " + requestHandler.caller())
+
+      // NONSTREAMING
+      if (requestHandler.method() == "/echo.Echo/Get") {
+        requestHandler.receiveMessage(initialMetadata:Metadata())
+        {(requestBuffer) in
+          if let requestBuffer = requestBuffer,
+            let requestMessage =
+            fileDescriptorSet.readMessage(name:"EchoRequest",
+                                          proto:requestBuffer.data()) {
+            requestMessage.forOneField(name:"text") {(field) in
+              let replyMessage = fileDescriptorSet.createMessage(name:"EchoResponse")!
+              replyMessage.addField(name:"text", value:"Swift nonstreaming echo " + field.string())
+              requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize()),
+                                          trailingMetadata:Metadata())
+            }
+          }
+        }
+      }
+
+      // STREAMING
+      if (requestHandler.method() == "/echo.Echo/Update") {
+        requestHandler.sendMetadata(
+          initialMetadata: Metadata(),
+          completion: {
+
+            self.handleMessage(
+              fileDescriptorSet: fileDescriptorSet,
+              requestHandler: requestHandler)
+
+            // we seem to never get this, but I'm told it's what we're supposed to do
+            requestHandler.receiveClose() {
+              requestHandler.sendStatus(trailingMetadata: Metadata(), completion: {
+                print("status sent")
+                requestHandler.shutdown()
+              })
+            }
+          }
+        )
+      }
+    }
+  }
+
+  func handleMessage(fileDescriptorSet: FileDescriptorSet,
+                     requestHandler: Handler) {
+    requestHandler.receiveMessage()
+      {(requestBuffer) in
+        if let requestBuffer = requestBuffer,
+          let requestMessage = fileDescriptorSet.readMessage(name:"EchoRequest",
+                                                             proto:requestBuffer.data()) {
+          requestMessage.forOneField(name:"text") {(field) in
+            let replyMessage = fileDescriptorSet.createMessage(name:"EchoResponse")!
+            replyMessage.addField(name:"text", value:"Swift streaming echo " + field.string())
+            requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize())) {
+              // after we've sent our response, prepare to handle another message
+              self.handleMessage(fileDescriptorSet:fileDescriptorSet, requestHandler:requestHandler)
+            }
+          }
+        } else {
+          // if we get an empty message (nil buffer), we close the connection
+          requestHandler.sendStatus(trailingMetadata: Metadata(), completion: {
+            print("status sent")
+            requestHandler.shutdown()
+          })
+        }
+    }
+  }
+}