C# 插座在第一次接收后停止

C# 插座在第一次接收后停止,c#,tcpclient,C#,Tcpclient,我有一个后台工作人员,我用它来监听端口 它工作得很好,问题是在第一次收到它后停止工作,我尝试使用“while(true)”并在RunWorkerComplete事件中重新启动它,但没有成功 使用stopPoints,我可以看到它使用正确的消息执行console.writeline(),然后它停止工作 using System.Net.Sockets; class Program { private static BackgroundWorker worker = new Ba

我有一个后台工作人员,我用它来监听端口
它工作得很好,问题是在第一次收到它后停止工作,我尝试使用“while(true)”并在RunWorkerComplete事件中重新启动它,但没有成功
使用stopPoints,我可以看到它使用正确的消息执行console.writeline(),然后它停止工作

    using System.Net.Sockets;

class Program
{

    private static BackgroundWorker worker = new BackgroundWorker();

    static void Main(string[] args)
    {
        Program P = new Program();

        P.notifyIcon1.Visible = true;
        P.ipaddress = IPAddress.Any;
        P.tcpServer = new TcpServer(P.ipaddress.ToString(), 3001);

        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        //worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        if (!worker.IsBusy) worker.RunWorkerAsync();

        Console.WriteLine("Press ENTER to exit the server.");
        Console.ReadLine();
    }


    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
         IPEndPoint endPoint;
        Socket tcpClient;
        Socket listener;
        int pendingConnectionQueueSize;
        IPAddress ipaddress = IPAddress.Any;

        endPoint = new IPEndPoint(ipaddress, 3001);

        pendingConnectionQueueSize = 100;
        listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        listener.Bind(endPoint);
        listener.Listen(pendingConnectionQueueSize);

        Console.WriteLine("conn..");
        byte[] receiveBuffer = new byte[4096];
        tcpClient = listener.Accept();
        tcpClient.RemoteEndPoint.ToString();

        while (true)
        {
            int rc = tcpClient.Receive(receiveBuffer);
             string msg = Encoding.ASCII.GetString(receiveBuffer);

            if (rc == 0)
                break;

            Console.WriteLine(msg.Trim());
        }

        listener.Close();
    }
    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!worker.IsBusy) worker.RunWorkerAsync();//restart

    }

}       
然后它就停止工作了

    using System.Net.Sockets;

class Program
{

    private static BackgroundWorker worker = new BackgroundWorker();

    static void Main(string[] args)
    {
        Program P = new Program();

        P.notifyIcon1.Visible = true;
        P.ipaddress = IPAddress.Any;
        P.tcpServer = new TcpServer(P.ipaddress.ToString(), 3001);

        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        //worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        if (!worker.IsBusy) worker.RunWorkerAsync();

        Console.WriteLine("Press ENTER to exit the server.");
        Console.ReadLine();
    }


    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
         IPEndPoint endPoint;
        Socket tcpClient;
        Socket listener;
        int pendingConnectionQueueSize;
        IPAddress ipaddress = IPAddress.Any;

        endPoint = new IPEndPoint(ipaddress, 3001);

        pendingConnectionQueueSize = 100;
        listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        listener.Bind(endPoint);
        listener.Listen(pendingConnectionQueueSize);

        Console.WriteLine("conn..");
        byte[] receiveBuffer = new byte[4096];
        tcpClient = listener.Accept();
        tcpClient.RemoteEndPoint.ToString();

        while (true)
        {
            int rc = tcpClient.Receive(receiveBuffer);
             string msg = Encoding.ASCII.GetString(receiveBuffer);

            if (rc == 0)
                break;

            Console.WriteLine(msg.Trim());
        }

        listener.Close();
    }
    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!worker.IsBusy) worker.RunWorkerAsync();//restart

    }

}       
显示的代码可以工作,并且可以读取尽可能多的数据;我用telnet测试了它,它工作得很好(如评论中所讨论的,缓冲区的ASCII解码仍然存在一些错误)


如果它只读取一次,那么我只能假设您的客户端没有在同一个连接上发送更多数据。显示的代码只接受一个连接,然后将其读取到底。

注意,当前代码无论如何都是错误的;您应该只查看
GetString(receiveBuffer,0,rc)
,甚至只有在
rc>0
时才查看;
Trim()
是偶然工作的-在正常情况下它不会做正确的事情。幸运的是,这是ASCII码,否则会有更多的复杂性;然而!在同一个连接上是否有更多的数据被发送到服务器?另外请注意:每当我看到一个套接字服务器被同步读取写入时,我都会非常紧张;这将是真的,真的很容易压倒这个服务器-如果它只是处理一个或两个并发客户端,好吧,我猜…测试本地与telnet,它是工作“足够好”;它肯定读取了不止一次。在数据大小为零的情况下,您可能有一个KeepAlive。因此,错误出现在if(rc==0)break;。删除中断,看看它是否有效。这是一个小的调整,我有局部;但要强调的是:它读了很多遍,非常开心,而且一直都是: