SignalR接收端口是随机的还是可以预定义的?

时间:2017-02-16 06:54:59

标签: c# signalr signalr.client

我在Windows服务上使用SignalR个中心作为自托管。有winforms个客户端与集线器通信。服务器在端口80上运行,并且工作正常。

我想知道的是,客户端在哪个端口发送或接收消息?

据我所知,我们离开客户机的端口和我们到达服务器的端口是或可以是不同的端口。我的客户端将运行的机器将是端口短路(大多数端口关闭),所以我认为我需要预定义客户端离开机器的端口。

  1. 我是这样想的吗?
  2. 如何在客户端创建客户端端口始终相同的连接?
  3. 这是我的客户代码:

    IHubProxy _TextCopierHub;
    HubConnection _HubConnection { get; set; }
    
    public TextCopierHub ( string url )
    {
        _HubConnection = new HubConnection(url);
        _TextCopierHub = _HubConnection.CreateHubProxy("TextCopierHub");
        _HubConnection.Credentials = CredentialCache.DefaultCredentials;
    
        if ( !_HubConnection.Start().Wait(10000) )
            throw new TimeoutException("Hub didn't start in 10 seconds");
    
        RegisterEvents();
    }
    

    注意:我无法模拟客户端环境,因此我甚至不确定这是否会出现问题,但我不想在此时感到惊讶我们安装客户端,因为客户已经指出了这个要求。

1 个答案:

答案 0 :(得分:1)

定期TCP / IP通信是从随机(或至少不是固定的)源端口进行的。这是因为您不能有多个clientip:sourceport-serverip:destport组合,因此TCP实现将保留已使用本地端口的列表,并在建立新连接时选择一个未使用的端口。

您可以选择.NET TcpClient constructor overload的源端口,但如果已使用该源端口,则应用程序将遇到问题。

由于SignalR会自动检测是否使用Websockets,http长轮询或其他传输机制,因此我不认为您可以为此设置源端口。

(此处选择传输方法的图表:How does SignalR decide which transport method to be used?)。