使属性TcpClient和IPEndPoint看起来已经固定了我的问题!如果有人能解释一下为什么会这样,我会很感激的。通常我会将我的类对象声明为静态的,但我并不完全理解为什么它能够以这种方式工作。
首先,我想说一下,我已经在Google上搜索了很多,但是没有找到任何可以回答我的问题的东西,所以如果已经有答案,请告诉我。
我已经成功地用C#编写了一个TCP服务器和客户端,但我希望我的客户端能够连接到多个服务器。明确一下,这不是一个有多个客户端连接的服务器,在这方面,我没有任何配置问题。下面是一个解释的图片:
很漂亮,我知道。但是说真的,我无法让它正常工作。我遇到了这个错误:已经连接过的套接字进行了连接请求。我有一个叫做client的类,里面包含了TcpClient和IPEndPoint:
即使连接在一个新线程上运行,我仍然得到相同的错误,但为什么呢?是否有人能给我指引一个解决方案,并希望能够解释我的思路中存在的缺陷?我现在想也许是套接字处理方式中的某些问题,但我确实不确定。非常感谢任何帮助,谢谢大家。
首先,我想说一下,我已经在Google上搜索了很多,但是没有找到任何可以回答我的问题的东西,所以如果已经有答案,请告诉我。
我已经成功地用C#编写了一个TCP服务器和客户端,但我希望我的客户端能够连接到多个服务器。明确一下,这不是一个有多个客户端连接的服务器,在这方面,我没有任何配置问题。下面是一个解释的图片:
![Client Connects to 2 Servers](https://istack.dev59.com/w92vW.webp)
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();
}
即使连接在一个新线程上运行,我仍然得到相同的错误,但为什么呢?是否有人能给我指引一个解决方案,并希望能够解释我的思路中存在的缺陷?我现在想也许是套接字处理方式中的某些问题,但我确实不确定。非常感谢任何帮助,谢谢大家。
client
(Client类中的实例变量)是静态成员吗?你的终端节点是什么? - Jason Fry