C# 从客户端C连接到多个TCP服务器#
使属性TcpClient和IPEndPoint看起来解决了我的问题!如果有人能解释为什么会这样,我将不胜感激。我通常会将我的类对象声明为静态的,但我不完全理解为什么它是这样工作的 我想像往常一样开始说,我已经搜索了很多次,但是没有找到任何答案,所以如果这个问题已经有答案,请告诉我 我已经成功地用C#编写了一个TCP服务器和客户端,但是我希望我的客户端能够连接到多个服务器。很明显,这不是一个连接了多个客户端的服务器,我在配置它时没有遇到任何问题。 这里有一张小图片解释我的意思: 漂亮,我知道。但说真的,我不能让它工作。我遇到了错误:在已连接的套接字上发出了连接请求 我有一个名为client的类,带有一个TcpClient和一个IPEndPoint:C# 从客户端C连接到多个TCP服务器#,c#,multithreading,sockets,tcp,client,C#,Multithreading,Sockets,Tcp,Client,使属性TcpClient和IPEndPoint看起来解决了我的问题!如果有人能解释为什么会这样,我将不胜感激。我通常会将我的类对象声明为静态的,但我不完全理解为什么它是这样工作的 我想像往常一样开始说,我已经搜索了很多次,但是没有找到任何答案,所以如果这个问题已经有答案,请告诉我 我已经成功地用C#编写了一个TCP服务器和客户端,但是我希望我的客户端能够连接到多个服务器。很明显,这不是一个连接了多个客户端的服务器,我在配置它时没有遇到任何问题。 这里有一张小图片解释我的意思: 漂亮,我知道。但
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)
您不是将indhosts.ElementAt(0)
发送给两个构造函数吗(毕竟,ipe
等于hosts.ElementAt(0)
所以您的问题已经解决了吗?如果是这样的话,我很乐意帮助您!是client
(客户端类中的实例变量)静态成员?您的终结点是什么?@JasonFry private TcpClient client;private IPEndPoint ip;它不是静态的,终结点根据服务器的不同而变化,但它可以通过DNS解析或显式键入。第一次连接实际通过,然后第二次尝试失败。我添加了一张我的小调试表单的图片,以便您可以我已经检查了错误代码,虽然有两个不同的构造函数,但它似乎连接在同一个地址上,我只是不知道为什么或者如何修复它