Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TcpListener不接收数据_C#_Sockets_Tcp_Server_Client - Fatal编程技术网

C# TcpListener不接收数据

C# TcpListener不接收数据,c#,sockets,tcp,server,client,C#,Sockets,Tcp,Server,Client,所以我的家庭作业是使用tcp数据包编写POP3消息传递软件,不允许im使用外部库。当我按下连接按钮时,我启动tcp连接,我还有一个断开连接的按钮,它会停止连接。我用PuTTY测试了我的服务器程序,在第一次连接后它工作正常,但当我按下Disconnect并再次连接时,它不会将收到的数据打印到监视器上。这个问题困扰了我好长时间,请帮忙。这是我的密码: 编辑: 问题是我不太了解线程是如何工作的,我没有为每个连接创建一个新线程,所以每次创建一个新的侦听器时,我都会实例化一个新线程 namespace P

所以我的家庭作业是使用tcp数据包编写POP3消息传递软件,不允许im使用外部库。当我按下连接按钮时,我启动tcp连接,我还有一个断开连接的按钮,它会停止连接。我用PuTTY测试了我的服务器程序,在第一次连接后它工作正常,但当我按下Disconnect并再次连接时,它不会将收到的数据打印到监视器上。这个问题困扰了我好长时间,请帮忙。这是我的密码:

编辑: 问题是我不太了解线程是如何工作的,我没有为每个连接创建一个新线程,所以每次创建一个新的侦听器时,我都会实例化一个新线程

namespace POP3Server
{
    public partial class MainWindow : Window
    {
        private TcpListener server;
        private Int32 port;
        private IPAddress ipAddress;
        private TcpClient client;
        private Logger log;
        private Thread tcpAcceptThread;
        private bool serverStarted;

        public MainWindow()
        {
            InitializeComponent();

            log = new Logger(txtConsole);

            serverStarted = false;
            tcpAcceptThread = new Thread(GetData);
        }

        private void btnConnect_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                port = Convert.ToInt32(txtPort.Text);
                ipAddress = IPAddress.Parse(txtIP.Text);
                server = new TcpListener(ipAddress, port);
                server.Start();

                if (tcpAcceptThread.ThreadState != ThreadState.Unstarted)
                    tcpAcceptThread.Start();

                serverStarted = true;
                log.WriteLine("Server started!");

                btnConnect.IsEnabled = false;
                btnDisconnect.IsEnabled = true;
            }
            catch (Exception ex)
            {
                log.WriteLine(ex.ToString());
            }
        }

        private void btnDisconnect_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (client != null)
                    client.Close();
                server.Stop();

                log.WriteLine("Server stopped!");
                serverStarted = false;

                btnConnect.IsEnabled = true;
                btnDisconnect.IsEnabled = false;
            }
            catch (Exception ex)
            {
                log.WriteLine(ex.ToString());
            }
        }

        private void GetData()
        {
            try
            {
                while (serverStarted)
                {
                    client = server.AcceptTcpClient();
                    this.Dispatcher.Invoke(() => log.WriteLine("Connected!"));

                    Byte[] bytes = new Byte[256];
                    String data = null;

                    NetworkStream stream = client.GetStream();

                    int i;

                    // Loop to receive all the data sent by the client.
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a ASCII string.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        this.Dispatcher.Invoke(() => log.WriteLine("Received: " + data));
                    }
                }
            }
            catch (Exception ex)
            {
                this.Dispatcher.Invoke(() => log.WriteLine(ex.ToString()));
            }
        }

        private void btnClear_Click(object sender, RoutedEventArgs e)
        {
            log.Clear();
        }
    }
}

你能更改下面的代码吗

private bool服务器启动;
致:

private object\u someLockObject=new object();
private bool\u serverStarted=false;
私有布尔服务器已启动{
得到{
锁定(_someLockObject)
{
返回服务器已启动;
}
}
设置{
锁定(_someLockObject)
{
_serverStarted=value;
}
}
};

我的第一个预感是布尔属性没有更新。

Hi Zoltan welcome。。考虑在服务器读取循环后处理请求和回答(某物),然后将您的Client。Couter()放在那个按钮上,而不是在按钮断开连接上。您现在正在为每个命令创建一个新的服务器端客户端,而不终止它。到目前为止,您做了什么来调试这个问题?你的调查揭示了什么?我觉得这个问题太宽泛了,因为代码中有许多元素似乎有问题,并且没有足够的上下文来说明您需要帮助解决哪些具体问题。也就是说,最大的问题之一是,您似乎错误地认为可以重用
线程
对象。你不能。如果您想为每个连接指定一个线程,那么每次重新连接时都需要创建一个新线程。@PeterDuniho我意识到我需要更深入地挖掘,以了解更多关于线程的信息。正如您所提到的,我为每个连接创建了一个新线程,它解决了这个问题,但现在它在GetData()函数中抛出了一个SocketException。我猜问题是我从另一个线程关闭了tcp侦听器,我不知道如何正确关闭它。我关闭了,但问题仍然存在。我为每个连接创建了一个新线程,它解决了这个问题,但这导致了下一个问题,在调用server.AcceptTcpClient()函数时,它抛出了一个SocketException。我认为问题在于我关闭了主线程中的tcp侦听器,但我不知道如何从其他线程关闭它。