main.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. * Copyright 2016, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import gRPC
  18. import CgRPC
  19. import Dispatch
  20. print("\(CommandLine.arguments)")
  21. // server options
  22. var server : Bool = false
  23. // client options
  24. var client : String = ""
  25. var message : String = "Testing 1 2 3"
  26. // self-test mode
  27. var test : Bool = false
  28. // general configuration
  29. var useSSL : Bool = false
  30. var i : Int = 0
  31. while i < Int(CommandLine.argc) {
  32. let arg = CommandLine.arguments[i]
  33. i = i + 1
  34. if i == 1 {
  35. continue // skip the first argument
  36. }
  37. if arg == "test" {
  38. test = true
  39. } else if arg == "serve" {
  40. server = true
  41. } else if (arg == "get") || (arg == "expand") || (arg == "collect") || (arg == "update") {
  42. client = arg
  43. } else if arg == "-ssl" {
  44. useSSL = true
  45. } else if arg == "-m" && (i < Int(CommandLine.argc)) {
  46. message = CommandLine.arguments[i]
  47. i = i + 1
  48. }
  49. }
  50. var latch = CountDownLatch(1)
  51. gRPC.initialize()
  52. if server {
  53. let echoProvider = EchoProvider()
  54. var echoServer: Echo_EchoServer!
  55. if useSSL {
  56. print("Starting secure server")
  57. let certificateURL = URL(fileURLWithPath:"ssl.crt")
  58. let keyURL = URL(fileURLWithPath:"ssl.key")
  59. echoServer = Echo_EchoServer(address:"localhost:8443",
  60. certificateURL:certificateURL,
  61. keyURL:keyURL,
  62. provider:echoProvider)
  63. } else {
  64. print("Starting insecure server")
  65. echoServer = Echo_EchoServer(address:"localhost:8081",
  66. provider:echoProvider)
  67. }
  68. echoServer.start()
  69. // Block to keep the main thread from finishing while the server runs.
  70. // This server never exits. Kill the process to stop it.
  71. latch.wait()
  72. }
  73. if client != "" {
  74. do {
  75. print("Starting client")
  76. var service : Echo_EchoService
  77. if useSSL {
  78. let certificateURL = URL(fileURLWithPath:"ssl.crt")
  79. let certificates = try! String(contentsOf: certificateURL)
  80. service = Echo_EchoService(address:"localhost:8443", certificates:certificates, host:"example.com")
  81. service.host = "example.com" // sample override
  82. } else {
  83. service = Echo_EchoService(address:"localhost:8081")
  84. }
  85. let requestMetadata = Metadata(["x-goog-api-key":"YOUR_API_KEY",
  86. "x-ios-bundle-identifier":"com.google.echo"])
  87. // Unary
  88. if client == "get" {
  89. var requestMessage = Echo_EchoRequest()
  90. requestMessage.text = message
  91. print("Sending: " + requestMessage.text)
  92. let responseMessage = try service.get(requestMessage)
  93. print("get received: " + responseMessage.text)
  94. }
  95. // Server streaming
  96. if client == "expand" {
  97. var requestMessage = Echo_EchoRequest()
  98. requestMessage.text = message
  99. print("Sending: " + requestMessage.text)
  100. let expandCall = try service.expand(requestMessage) {result in }
  101. var running = true
  102. while running {
  103. do {
  104. let responseMessage = try expandCall.receive()
  105. print("Received: \(responseMessage.text)")
  106. } catch Echo_EchoClientError.endOfStream {
  107. print("expand closed")
  108. running = false
  109. }
  110. }
  111. }
  112. // Client streaming
  113. if client == "collect" {
  114. let collectCall = try service.collect() {result in }
  115. let parts = message.components(separatedBy:" ")
  116. for part in parts {
  117. var requestMessage = Echo_EchoRequest()
  118. requestMessage.text = part
  119. print("Sending: " + part)
  120. try collectCall.send(requestMessage) {error in print(error)}
  121. sleep(1)
  122. }
  123. let responseMessage = try collectCall.closeAndReceive()
  124. print("Received: \(responseMessage.text)")
  125. }
  126. // Bidirectional streaming
  127. if client == "update" {
  128. let updateCall = try service.update() {result in}
  129. DispatchQueue.global().async {
  130. var running = true
  131. while running {
  132. do {
  133. let responseMessage = try updateCall.receive()
  134. print("Received: \(responseMessage.text)")
  135. } catch Echo_EchoClientError.endOfStream {
  136. print("update closed")
  137. latch.signal()
  138. break
  139. } catch (let error) {
  140. print("error: \(error)")
  141. }
  142. }
  143. }
  144. let parts = message.components(separatedBy:" ")
  145. for part in parts {
  146. var requestMessage = Echo_EchoRequest()
  147. requestMessage.text = part
  148. print("Sending: " + requestMessage.text)
  149. try updateCall.send(requestMessage) {error in print(error)}
  150. sleep(1)
  151. }
  152. try updateCall.closeSend()
  153. // Wait for the call to complete.
  154. latch.wait()
  155. }
  156. } catch let error {
  157. print("error:\(error)")
  158. }
  159. }
  160. if test {
  161. print("self test")
  162. }