Browse Source

Simplify the "Simple" sample app into a single executable.

Tim Burks 9 years ago
parent
commit
2ed004b743

+ 4 - 2
Examples/Sessions/README.md

@@ -1,7 +1,9 @@
 # Sessions, a Swift gRPC Sample App
 
-This sample illustrates the use of experimental Swift gRPC APIs in
-clients and servers.
+This sample illustrates the use of low-level Swift gRPC APIs in
+clients and servers. Please note that typical gRPC applications
+would not use these APIs but would use code generated using the
+Swift gRPC plugin for protoc.
 
 The Sessions Xcode project contains a Mac app that can be used to 
 instantiate and run local gRPC clients and servers. It depends

+ 0 - 0
Examples/Simple/SimpleClient/Makefile → Examples/Simple/Makefile


+ 1 - 1
Examples/Simple/SimpleClient/Package.swift → Examples/Simple/Package.swift

@@ -32,7 +32,7 @@
  */
 import PackageDescription
 let package = Package (
-    name: "SimpleClient",
+    name: "Simple",
     dependencies: [
         .Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,1,0)),
     ]

+ 14 - 0
Examples/Simple/README.md

@@ -0,0 +1,14 @@
+# Simple, a Swift gRPC Sample App
+
+This sample illustrates the use of low-level Swift gRPC APIs in
+clients and servers. Please note that typical gRPC applications
+would not use these APIs but would use code generated using the
+Swift gRPC plugin for protoc.
+
+The Simple app is built with the Swift Package Manager and is
+a command-line tool that can be run as a client or server. 
+Pass the "server" argument to run it as a server and "client"
+to run it as a client.
+
+It requires a local build of the gRPC Core C library. To build 
+that, please run "make" in the root of your gRPC distribution.

+ 0 - 9
Examples/Simple/SimpleServer/Makefile

@@ -1,9 +0,0 @@
-LIBDIR = /usr/local/lib
-INCDIR = /usr/local/include
-
-all:
-	swift build -Xlinker -L$(LIBDIR) -Xlinker -lgrpc -Xcc -I$(INCDIR)
-
-clean :
-	rm -rf Packages
-	rm -rf .build

+ 0 - 39
Examples/Simple/SimpleServer/Package.swift

@@ -1,39 +0,0 @@
-/*
- *
- * Copyright 2016, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-import PackageDescription
-let package = Package (
-    name: "SimpleServer",
-    dependencies: [
-        .Package(url: "https://github.com/grpc/grpc-swift.git", Version(0,1,0)),
-    ]
-)

+ 0 - 97
Examples/Simple/SimpleServer/main.swift

@@ -1,97 +0,0 @@
-/*
- *
- * Copyright 2016, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-import gRPC
-import Foundation
-
-gRPC.initialize()
-print("gRPC version", gRPC.version())
-
-let server = gRPC.Server(address:"localhost:8001")
-var requestCount = 0
-
-let done = NSCondition()
-
-server.run() {(requestHandler) in
-
-  do {
-    requestCount += 1
-
-    print("\(requestCount): Received request " + requestHandler.host
-      + " " + requestHandler.method
-      + " from " + requestHandler.caller)
-
-    let initialMetadata = requestHandler.requestMetadata
-    for i in 0..<initialMetadata.count() {
-      print("\(requestCount): Received initial metadata -> " + initialMetadata.key(index:i)
-        + ":" + initialMetadata.value(index:i))
-    }
-
-    let initialMetadataToSend = Metadata([["a": "Apple"],
-                                          ["b": "Banana"],
-                                          ["c": "Cherry"]])
-    try requestHandler.receiveMessage(initialMetadata:initialMetadataToSend)
-    {(messageData) in
-      let messageString = String(data: messageData!, encoding: .utf8)
-      print("\(requestCount): Received message: " + messageString!)
-    }
-
-    if requestHandler.method == "/quit" {
-      print("quitting")
-      done.lock()
-      done.signal()
-      done.unlock()
-    }
-
-    let replyMessage = "hello, client!"
-    let trailingMetadataToSend = Metadata([["0": "zero"],
-                                           ["1": "one"],
-                                           ["2": "two"]])
-    try requestHandler.sendResponse(message:replyMessage.data(using: .utf8)!,
-                                    statusCode:0,
-                                    statusMessage:"OK",
-                                    trailingMetadata:trailingMetadataToSend)
-
-    print("------------------------------")
-  } catch (let callError) {
-    Swift.print("call error \(callError)")
-  }
-}
-
-server.onCompletion() {
-  print("Server Stopped")
-}
-
-done.lock()
-done.wait()
-done.unlock()
-

+ 89 - 5
Examples/Simple/SimpleClient/main.swift → Examples/Simple/main.swift

@@ -35,12 +35,32 @@ import Foundation
 
 let address = "localhost:8001"
 let host = "foo.test.google.fr"
-let message = "hello, server!".data(using: .utf8)
 
-gRPC.initialize()
-print("gRPC version", gRPC.version())
+func usage() {
+  print("Usage: Simple <client|server>\n")
+  exit(0)
+}
+
+func main() throws {
+  gRPC.initialize()
+  print("gRPC version", gRPC.version())
+
+  print("\(CommandLine.arguments)")
+  if CommandLine.arguments.count != 2 {
+    usage()
+  }
 
-do {
+  let command = CommandLine.arguments[1]
+  switch command {
+  case "client": try client()
+  case "server": try server()
+  default:
+    usage()
+  }
+}
+
+func client() throws {
+  let message = "hello, server!".data(using: .utf8)
   let c = gRPC.Channel(address:address)
   let steps = 3
   for i in 0..<steps {
@@ -80,6 +100,70 @@ do {
     done.wait()
     done.unlock()
   }
+  print("Done")
 }
 
-print("Done")
+func server() throws {
+  let server = gRPC.Server(address:address)
+  var requestCount = 0
+
+  let done = NSCondition()
+
+  server.run() {(requestHandler) in
+
+    do {
+      requestCount += 1
+
+      print("\(requestCount): Received request " + requestHandler.host
+        + " " + requestHandler.method
+        + " from " + requestHandler.caller)
+
+      let initialMetadata = requestHandler.requestMetadata
+      for i in 0..<initialMetadata.count() {
+        print("\(requestCount): Received initial metadata -> " + initialMetadata.key(index:i)
+          + ":" + initialMetadata.value(index:i))
+      }
+
+      let initialMetadataToSend = Metadata([["a": "Apple"],
+                                            ["b": "Banana"],
+                                            ["c": "Cherry"]])
+      try requestHandler.receiveMessage(initialMetadata:initialMetadataToSend)
+      {(messageData) in
+        let messageString = String(data: messageData!, encoding: .utf8)
+        print("\(requestCount): Received message: " + messageString!)
+      }
+
+      if requestHandler.method == "/quit" {
+        print("quitting")
+        done.lock()
+        done.signal()
+        done.unlock()
+      }
+
+      let replyMessage = "hello, client!"
+      let trailingMetadataToSend = Metadata([["0": "zero"],
+                                             ["1": "one"],
+                                             ["2": "two"]])
+      try requestHandler.sendResponse(message:replyMessage.data(using: .utf8)!,
+                                      statusCode:0,
+                                      statusMessage:"OK",
+                                      trailingMetadata:trailingMetadataToSend)
+
+      print("------------------------------")
+    } catch (let callError) {
+      Swift.print("call error \(callError)")
+    }
+  }
+
+  server.onCompletion() {
+    print("Server Stopped")
+  }
+
+  done.lock()
+  done.wait()
+  done.unlock()
+}
+
+try main()
+
+