使用C#从客户端连接到多个TCP服务器

3
使属性TcpClient和IPEndPoint看起来已经固定了我的问题!如果有人能解释一下为什么会这样,我会很感激的。通常我会将我的类对象声明为静态的,但我并不完全理解为什么它能够以这种方式工作。
首先,我想说一下,我已经在Google上搜索了很多,但是没有找到任何可以回答我的问题的东西,所以如果已经有答案,请告诉我。
我已经成功地用C#编写了一个TCP服务器和客户端,但我希望我的客户端能够连接到多个服务器。明确一下,这不是一个有多个客户端连接的服务器,在这方面,我没有任何配置问题。下面是一个解释的图片: Client Connects to 2 Servers 很漂亮,我知道。但是说真的,我无法让它正常工作。我遇到了这个错误:已经连接过的套接字进行了连接请求。我有一个叫做client的类,里面包含了TcpClient和IPEndPoint:
public  Client(IPEndPoint ip) 
    {
        client = new TcpClient(); 
        this.ip = ip; 
    }

这个类有连接(connect),发送(send),接收(receive)等方法。问题出现在我像这样做的时候:

Client host = new Client(hosts.ElementAt(0));
IPEndPoint ipe = hosts.ElementAt(0);

编辑:这个构造函数出现在不同的方法中,而不是“主机”构造函数所在的方法。 客户端 client = new Client(ipe); client.ConnectAsync(); host.ConnectAsync(); 最初我尝试使用新的异步方法和等待功能,当只有一个主机时它工作得很好,但在第二个主机上出现错误。我认为可能是因为我正在使用相同的方法,并且在第一个await完成之前尝试进行连接,它将尝试在第一个IP上再次连接,不知道是否有任何意义,但基本上我想,好吧,我将为每个连接尝试创建一个新线程,如下所示:

    public void ConnectAsync()
    {
        ThreadPool.QueueUserWorkItem(delegate { ConnectAsyncMethod(); });
    }

        private void ConnectAsyncMethod()
    {
        Thread connectThread = new Thread(() =>
        {
            try
            {
                client.Connect(ip.Address, ip.Port);
                this.clientStream = client.GetStream();
                ReceiveAsync();
            }
            catch (SocketException se)
            {
            }
            catch (NotSupportedException ns)
            {
            }
            catch (Exception e)
            {
            }
        });
        connectThread.Start();
    }

即使连接在一个新线程上运行,我仍然得到相同的错误,但为什么呢?是否有人能给我指引一个解决方案,并希望能够解释我的思路中存在的缺陷?我现在想也许是套接字处理方式中的某些问题,但我确实不确定。非常感谢任何帮助,谢谢大家。

1
client(Client类中的实例变量)是静态成员吗?你的终端节点是什么? - Jason Fry
@JasonFryprivate TcpClient client;private IPEndPoint ip;它不是静态的,端点根据服务器而变化,但它可以从DNS解析或显式输入。第一次连接实际上成功了,然后第二次尝试失败了。我添加了一个我的小调试窗体的图片,这样你也许可以了解发生了什么。 - Matt
2个回答

0
你需要多个Client对象来建立到不同地址(实际上也可以是相同地址)的多个连接。例如,你可以让一个Client对象ClientA连接到服务器A,另一个Client对象ClientB连接到服务器B。但是,你不能让同一个Client对象两次连接到不同或相同的地址。在这种情况下,你需要创建多个Client对象。

回顾一下问题,我创建了两个不同的Client对象: Client host = new Client(hosts.ElementAt(0)); Client client = new Client(ipe); - Matt
@初学者程序员 抱歉,我看得太快了。这很奇怪,因为这个错误应该是在尝试两次连接相同的TCPClient时发生的。另一个问题可能是你可能会尝试两次连接到相同的地址和相同的端口。你有检查过吗? - Francis Lord
抱歉,它们实际上在两个不同的子方法中。configHost() 处理主机,而 configClient() 则处理客户端。将属性设置为静态解决了我遇到的问题。只是不太确定为什么会这样... - Matt
1
你的问题解决了吗?如果是这样,我很高兴能帮助你! - Francis Lord
看起来是这样,我需要再做一些测试,但目前为止还不错! - Matt
显示剩余2条评论

-1

我已经检查了错误代码,似乎它连接到相同的地址,尽管有两个不同的构造函数,但我无法弄清楚为什么或如何修复它。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接