C# TCP连接断开/或无法通过TCP接收数据

C# TCP连接断开/或无法通过TCP接收数据,c#,tcp,tcpclient,tcplistener,C#,Tcp,Tcpclient,Tcplistener,我有一台客户端PC使用我编写的TCP_客户端程序通过TCP向我发送数据。基本上,我正在向服务器发送一条“Hello消息” class Program { const int ourPort = 9090; static IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.10"), 3000); static ASCIIEncoding encoder = new ASCIIEncod

我有一台客户端PC使用我编写的TCP_客户端程序通过TCP向我发送数据。基本上,我正在向服务器发送一条“Hello消息”

class Program
{
    const int ourPort = 9090;
    static IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.10"), 3000);
    static ASCIIEncoding encoder = new ASCIIEncoding();
    static System.Timers.Timer aTimer;
    static void Main(string[] args)
    {
        aTimer = new System.Timers.Timer(200);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.Enabled = true;

        Console.Read();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        try
        {
            TcpClient client = new TcpClient();
            client.Connect(serverEndPoint);
            NetworkStream clientStream = client.GetStream();

            byte[] buffer = encoder.GetBytes("Hello Server!");

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
        catch (Exception ee)
        {
            Console.WriteLine(ee.ToString());
        }
    }
我正在使用我的电脑,通过我编写的TCP_服务器程序来接收数据

class Server
{
    private static TcpListener tcpListener;
    static System.Timers.Timer aTimer;
    static int count = 0;
    public Server()
    {
        //
    }

    static void Main(string[] args)
    {
        tcpListener = new TcpListener(IPAddress.Any, 3000);
        tcpListener.Start();

        aTimer = new System.Timers.Timer(200);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.Enabled = true;


        Console.Read();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        TcpClient client = tcpListener.AcceptTcpClient();
        Thread.Sleep(2);
        NetworkStream clientStream = client.GetStream();
        Thread.Sleep(2);

        byte[] message = new byte[4096];
        int bytesRead;

        bytesRead = 0;

        try
        {
            bytesRead = clientStream.Read(message, 0, 4096);
            client.Close();
        }
        catch (Exception ee)
        {
            Console.WriteLine("socket error");
            Console.WriteLine(ee.ToString());
            client.Close();
        }

        if (bytesRead == 0)
        {
            client.Close();
        }
        count++;

        ASCIIEncoding encoder = new ASCIIEncoding();
        Console.WriteLine(count + " " + encoder.GetString(message, 0, bytesRead));
    }
尽管如此,我看到的问题是,偶尔我会在我的TCP_服务器程序上点击
Catch()
中的“套接字错误”

错误:

System.IO.IOException:无法从传输连接读取数据:exi
远程主机强制关闭了sting连接。-->System.Net.Sockets
.SocketException:远程主机强制关闭了现有连接
在System.Net.Sockets.Socket.Receive(字节[]缓冲区,Int32偏移量,Int32大小,
SocketFlags(SocketFlags)
位于System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32 s
(放大)
---内部异常堆栈跟踪的结束---
位于System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32 s
(放大)
在中的test_tcp_manager.Server.OnTimedEvent(对象源,ElapsedEventArgs e)处
c:\Users\user\Documents\Visual Studio 2012\Projects\test\u tcp\u manager\test\u tcp\u ma
nager\Program.cs:第52行
错误在一秒钟或几秒钟内不规则地发生。我想知道为什么,我想知道如何解决这个问题

U**根据用户输入更新修复程序** 用户Usr反馈的第一个代码修复:

tcp_客户端代码现在如下所示:

类程序
{
港口内的常数=9090;
静态IPEndPoint serverEndPoint=新IPEndPoint(IPAddress.Parse(“172.22.1.22”),3000);
静态Asciencoding编码器=新的Asciencoding();
静态void Main(字符串[]参数)
{
while(true)
{
尝试
{
使用(TcpClient client=new TcpClient())
{
Connect(serverEndPoint);
NetworkStream clientStream=client.GetStream();
byte[]buffer=encoder.GetBytes(“你好服务器!”);
Write(buffer,0,buffer.Length);
client.Close();
}
}
捕获(异常ee)
{
Console.WriteLine(ee.ToString());
}
}
}
}
tcp_服务器代码现在如下所示:

类服务器
{
专用静态TcpListener TcpListener;
静态整数计数=0;
公共服务器()
{
//
}
静态void Main(字符串[]参数)
{
tcpListener=新的tcpListener(IPAddress.Any,3000);
tcpListener.Start();
while(true)
{
TcpClient client=tcpListener.AcceptTcpClient();
NetworkStream clientStream=client.GetStream();
字节[]消息=新字节[4096];
int字节读取;
字节读取=0;
尝试
{
bytesRead=clientStream.Read(消息,04096);
}
捕获(异常ee)
{
控制台写入线(“套接字错误”);
Console.WriteLine(ee.ToString());
}
计数++;
ascienceoding编码器=新的ascienceoding();
Console.WriteLine(count+“”+encoder.GetString(message,0,bytesRead));
}
}
}
  • 发送消息后,不要忘记关闭客户端。连接将一直保持,直到GC决定将其关闭
  • 刷新网络流没有任何作用。不要迷信,把所有东西都冲洗干净,因为这样看起来更安全
  • 你正在接受一个计时器。我以前从未见过这种错误。你为什么这么做?您应该在一个循环中接受所有连接的客户端,并独立地为它们提供服务。为什么要将服务器限制为每个计时器计时一个客户端
  • 取下睡衣。每当你认为你需要睡觉的时候,多想想
  • 您假设您将在第一次阅读时阅读“消息”。Read至少返回一个字节。它不能保证其他任何东西。TCP没有消息。确保您的代码能够按字节处理接收传入数据
  • 对所有可使用的资源使用using语句,并摆脱所有那些令人尴尬的接近呼叫

  • 很多问题。套接字编程很难。非常小心。

    @usr我更新了上面的代码,与您的建议相符吗?这是一个很好的进步!(5) 这个问题仍未解决。这是一个潜在的bug,对于较小的消息大小,您不会注意到它。完成对客户端的服务后,还需要关闭服务器上的
    客户端
    。如何修复5?我不明白那部分。我会使用一个更大的缓冲区?@user3573417首先,理解为什么你的代码有bug。如果操作系统选择以单字节块的形式向您提供数据,会发生什么情况?这是合法行为,会导致你的应用程序出现错误(你同意吗?)。一定要搞定这个。如果你不理解这个问题,套接字编程将是你的痛苦。