[英]Unable to make a connection between trivial C# gRPC client and server
[英]iPhone Swift gRPC client gets “Connection refused” from Windows C# gRPC Server
I have a gRPC server written in C# running in Windows 10. I can connect to it and invoke services with a C# gRPC client on the same PC, but when I try to connect from an iPhone running a simple client in Swift, the app reports
2021-02-12 12:28:48.639854-0800 grpc-Swift[53758:732067] [connection] nw_socket_handle_socket_event [C5:1] Socket SO_ERROR [61: Connection refused]
當我在 Windows PC 上的同一端口上運行手機時,我能夠從手機連接到 Golang 服務器,因此這不是布線或防火牆問題。 我錯過了什么??
.proto 文件
syntax = "proto3";
package chat;
option go_package = "github.com/monkrus/grpc-from0;grpc_from0";
message Message{
string body = 1;
}
service ChatService{
rpc SayHello(Message) returns (Message) {}
}
c# 服務器:
using System.Threading.Tasks;
using Chat;
using Grpc.Core;
namespace ChatServer {
public class ChatServiceImpl : ChatService.ChatServiceBase {
public override Task<Message> SayHello( Message request, ServerCallContext context ) {
Message reply = new Message { Body = "Got it!" };
return Task.FromResult( reply );
}
}
class Program {
static int port = 2319;
static void Main( string[] args ) {
Console.WriteLine( $"Starting Chat Server on port {port}" );
Server server = new Server {
Services = { ChatService.BindService( new ChatServiceImpl() ) },
Ports = { new ServerPort( "localhost", port, ServerCredentials.Insecure ) }
};
server.Start();
Console.WriteLine( "Server started. Press any key to exit." );
Console.ReadKey();
server.ShutdownAsync().Wait();
}
}
}
iPhone客戶端ViewController.swift:
import UIKit
import GRPC
class ViewController: UIViewController {
var client:Chat_ChatServiceClient?
override func viewDidLoad() {
super.viewDidLoad()
setupConnection()
}
func setupConnection(){
let eventGroup = PlatformSupport.makeEventLoopGroup(loopCount: 1)
let channel = ClientConnection.insecure(group: eventGroup).connect(host:
"192.168.86.44", port: 2319 )
self.client = Chat_ChatServiceClient(channel: channel)
}
@IBAction func sendMessage(){
createMessage()
}
func createMessage(){
var message = Chat_Message()
message.body = "Hello from swift"
let x = client?.sayHello(message).response
x?.whenSuccess({ (message) in print("response from server: \(message.body)") })
}
}
在 Windows 上運行的 golang 服務器:
package main
import (
"log"
"net"
"fmt"
"go-grpc-tutorial/chat"
"google.golang.org/grpc"
)
func main() {
fmt.Println( "Listening on port 2319..." )
lis, err := net.Listen("tcp", ":2319")
if err != nil {
log.Fatalf("Failed to listen on port 2319: %v", err)
}
s := chat.Server{}
grpcServer := grpc.NewServer()
chat.RegisterChatServiceServer(grpcServer, &s)
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("Failed to serve grpc server over port 2319: %v", err)
}
}
找到了! 我將服務器初始化從
Ports = { new ServerPort( "localhost", port, ServerCredentials.Insecure )
至
Ports = { new ServerPort( "0.0.0.0", port, ServerCredentials.Insecure )
並且所有工作都按預期進行。
如果我在客戶端網絡上使用服務器的 IP 地址 - 即“192.168.86.44”,它也可以工作。 很想聽聽這個數字是如何解釋的——如果“localhost”是一個與客戶端不同的網絡? 如果“0.0.0.0”只是一個通配符......?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.