【发布时间】:2015-12-06 14:44:21
【问题描述】:
在使用 TcpClient 和 TcpListener 时抛出这个异常,我有点不知所措。它第一次工作,然后我再次运行它,我得到以下异常:
每个套接字地址(协议/网络地址/端口)通常只允许使用一次 127.0.0.1:8086
我已检查以确保我正在关闭所有打开的连接。我尝试在 TcpClient 上手动调用 close 以及使用 IDisposable using 模式,但仍然遇到同样的问题。
这是代码,如果您将其复制粘贴到 Visual Studio 中,它应该会运行(前提是您已添加以下 using 语句)
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
internal class Program
{
private static void tcpClientConnection()
{
Console.WriteLine("Ready");
Console.ReadKey();
IPAddress address = IPAddress.Parse("127.0.0.1");
using (TcpClient client = new TcpClient(new IPEndPoint(address, 8087)))
{
client.Connect(new IPEndPoint(address, 8086));
using (NetworkStream ns = client.GetStream())
{
ns.Write(System.Text.Encoding.ASCII.GetBytes("Hello"), 0, "Hello".Length);
ns.Flush();
}
Console.WriteLine("Closing client");
}
}
internal static void Main(string[] args)
{
IPAddress address = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(new IPEndPoint(address, 8086));
server.Start();
using (Task task2 = new Task(tcpClientConnection))
{
task2.Start();
using (TcpClient client = server.AcceptTcpClient())
{
using (NetworkStream ns = client.GetStream())
{
using (MemoryStream ms = new MemoryStream())
{
ns.CopyTo(ms);
byte[] data = ms.ToArray();
Console.WriteLine(System.Text.Encoding.ASCII.GetString(data));
}
}
}
Console.WriteLine("Server stop");
Console.ReadKey();
server.Stop();
}
Console.WriteLine("END");
Console.ReadKey();
}
}
请注意,我查看了类似问题中提供的解决方案,但无法看到问题所在...
【问题讨论】:
-
对于 TcpClient,不要指定本地端点。我认为这可以解决问题,无论如何你都不应该这样做,因为它什么也没做。
-
好地方,确实马上解决了问题,谢谢!我将阅读指定本地端点的作用。它不是每次都有使用相同端口的套接字吗?如果所有的连接都被关闭了,继续使用相同的地址和端口应该不行吗?只是想知道,谢谢