Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从客户端C连接到多个TCP服务器#_C#_Multithreading_Sockets_Tcp_Client - Fatal编程技术网

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

C# 从客户端C连接到多个TCP服务器#,c#,multithreading,sockets,tcp,client,C#,Multithreading,Sockets,Tcp,Client,使属性TcpClient和IPEndPoint看起来解决了我的问题!如果有人能解释为什么会这样,我将不胜感激。我通常会将我的类对象声明为静态的,但我不完全理解为什么它是这样工作的 我想像往常一样开始说,我已经搜索了很多次,但是没有找到任何答案,所以如果这个问题已经有答案,请告诉我 我已经成功地用C#编写了一个TCP服务器和客户端,但是我希望我的客户端能够连接到多个服务器。很明显,这不是一个连接了多个客户端的服务器,我在配置它时没有遇到任何问题。 这里有一张小图片解释我的意思: 漂亮,我知道。但

使属性TcpClient和IPEndPoint看起来解决了我的问题!如果有人能解释为什么会这样,我将不胜感激。我通常会将我的类对象声明为静态的,但我不完全理解为什么它是这样工作的

我想像往常一样开始说,我已经搜索了很多次,但是没有找到任何答案,所以如果这个问题已经有答案,请告诉我

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

漂亮,我知道。但说真的,我不能让它工作。我遇到了错误:在已连接的套接字上发出了连接请求 我有一个名为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);
编辑:此构造函数与“宿主”构造函数使用的方法不同 客户=新客户(ipe); ConnectAsync(); ConnectAsync(); 现在,我最初尝试使用新的异步方法和wait特性,当它只有一个主机时工作正常,但在第二个主机上就开始出错。我想可能是因为我使用的是相同的方法,它在第一次等待完成之前尝试连接,它会尝试在第一个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();
    }
即使连接是在一个新线程上运行的,我仍然会得到相同的错误,但是为什么呢? 有谁能给我指出一个解决方案,并希望能解释一下我思维中的缺陷在哪里?我现在在想也许这是处理套接字的方式,但我真的不确定。
非常感谢您的帮助,谢谢大家。

您需要多个
客户端
对象来建立到不同地址(或相同地址)的多个连接。例如您可以让
客户端a
连接到服务器a,让
客户端B
连接到服务器B。您不能让相同的
客户端
对象两次连接到不同的或相同的地址。

这很奇怪。也许您应该检查第二个客户端端口是否与第一个客户端端口冲突,后者将导致错误。 我在这里找到了这本书的官方手册(10056):

回头看这个问题,我建立了两个不同的客户机对象:客户机主机=新客户机(hosts.ElementAt(0));客户=新客户(ipe)@对不起,我看得太快了。这很奇怪,因为如果您尝试连接同一个TCP客户端两次,就会发生此错误。我看到的另一个问题是,您可能会尝试连接到同一地址和同一端口两次。你检查过了吗?这里是非常奇怪的地方,第一个客户端在IP:XXX.XX.XXX.XXX:2000上连接第二个调用connect,我得到上面的错误,说我在XXX.XX.XXX.XXX:2000上连接,即使第二个被构造的客户端连接到YY.YY.YY.YY:3023,所以是的,它似乎使用相同的IP连接,尽管使用了两个不同的客户端对象
client-host=new-client(hosts.ElementAt(0))
IPEndPoint ipe=hosts.ElementAt(0)
客户端=新客户端(ipe)
您不是将ind
hosts.ElementAt(0)
发送给两个构造函数吗(毕竟,
ipe
等于
hosts.ElementAt(0)
所以您的问题已经解决了吗?如果是这样的话,我很乐意帮助您!是
client
(客户端类中的实例变量)静态成员?您的终结点是什么?@JasonFry private TcpClient client;private IPEndPoint ip;它不是静态的,终结点根据服务器的不同而变化,但它可以通过DNS解析或显式键入。第一次连接实际通过,然后第二次尝试失败。我添加了一张我的小调试表单的图片,以便您可以我已经检查了错误代码,虽然有两个不同的构造函数,但它似乎连接在同一个地址上,我只是不知道为什么或者如何修复它