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

时间:2014-10-10 00:04:56

标签: c# multithreading sockets tcp client

使属性TcpClient和IPEndPoint似乎解决了我的问题!如果有人能解释为什么会这样,我会很感激。我通常会声明我的类对象是静态的,但我并不完全理解为什么它会以这种方式工作。

我想首先说通常,我用谷歌搜索和谷歌搜索但没有找到任何回答我的问题,所以请指出我是否已经回答了这个问题。

我已经在C#中成功编写了一个TCP服务器和客户端,但我希望我的客户端能够连接到多个服务器。要明确这是一个连接了多个客户端的服务器,我没有遇到任何问题。 这是一张解释我的意思的小图片:

Client Connects to 2 Servers

漂亮,我知道。但严肃地说,我不能让这个工作。我遇到了错误:在已连接的套接字上发出连接请求 我有一个名为client的类,有一个TcpClient和一个IPEndPoint:

public  Client(IPEndPoint ip) 
    {
        client = new TcpClient(); 
        this.ip = ip; 
    }

这个类有连接,发送,接收等方法。当我做这样的事情时会出现问题:

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

编辑:此构造函数的方法与“host”构造函数的方法不同     客户端客户端=新客户端(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();
    }

即使connect在新线程上运行,我仍然会得到相同的错误,但为什么呢? 任何人都可以指出我的解决方案,并希望解释我思想中的缺陷在哪里?我现在想也许是套接字处理的方式,但我真的不确定。 我感谢任何帮助,谢谢大家。

2 个答案:

答案 0 :(得分:0)

您需要多个 Client个对象才能将多个连接建立到不同的地址(或实际上相同)。例如,您可以将Client ClientA连接到服务器A并使Client ClientB连接到服务器B.您不能将相同的Client对象连接两次到不同或相同的地址。

答案 1 :(得分:-1)

这很奇怪。也许你会检查第二个客户端端口是否与导致错误的第一个客户端冲突。 在这里,我找到了这个官方手册(10056): http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa924071(v=vs.85).aspx