如何断开处于Tcplistener模式的服务器? [英] How Do I Disconnect A Server Which Is In A Tcplistener Mode?

查看:84
本文介绍了如何断开处于Tcplistener模式的服务器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有一台服务器正在端口上运行并正在等待连接。

连接部分工作正常但是当我点击断开连接时按钮,它实际上正在断开连接。

这是我的代码的一部分

Hi,
I have a server which is running on a port and is waiting for connections.
The connect part is working fine but when i click on "Disconnect" button, it is actually disconnecting.
Here is the part of my code

private void btnDisconnect_Click(object sender, EventArgs e)
        {
            if (btnDisconnect.Enabled == true)
            {
                btnDisconnect.BackColor = System.Drawing.Color.DarkBlue;
                btnDisconnect.ForeColor = System.Drawing.Color.AntiqueWhite;
                Listener l = new Listener(ipAddr); 
                try
                {
                    
                    txtLog.AppendText("Stopping listener");
                    l.disConnect();
                    txtLog.AppendText("stopped");
                }
                catch (Exception)
                {
                    txtLog.AppendText("Unhandled Listener Close");
                }
            }
        }





这是听众类



Here is the listener class

class Listener
    {
        private IPAddress ipAddress;
        private TcpClient tcpClient;
        private TcpListener tcpListener;
        private Thread thrListener;
        bool ServRunning = false;
        // The event and its argument will notify the form when a user has connected, disconnected, send message, etc.
        public static event StatusChangedEventHandler StatusChanged;
        private static StatusChangedEventArgs e;
        public Listener(IPAddress address)
        {
            ipAddress = address;
        }
        public static void OnStatusChanged(StatusChangedEventArgs e)
        {
            StatusChangedEventHandler statusHandler = StatusChanged;
            if (statusHandler != null)
            {
                // Invoke the delegate
                statusHandler(null, e);
            }
        }
        public void startListening()
        {

            // Get the IP of the first network device, however this can prove unreliable on certain configurations
            IPAddress ipaLocal = ipAddress;

            // Create the TCP listener object using the IP of the server and the specified port
            tcpListener = new TcpListener(ipaLocal, 13);

            // Start the TCP listener and listen for connections
            tcpListener.Start();

            // The while loop will check for true in this before checking for connections
            ServRunning = true;

            // Start the new tread that hosts the listener
            thrListener = new Thread(KeepListening);
            thrListener.Start();
        }

        private void KeepListening()
        {
            // While the server is running
            while (ServRunning == true)
            {
                // Accept a pending connection
                tcpClient = tcpListener.AcceptTcpClient();
                e = new StatusChangedEventArgs("Connected");
                OnStatusChanged(e);
                bool m = true;
                while (m)
                {
                    byte[] bytes = new byte[2560];
                    NetworkStream stream = tcpClient.GetStream();
                    stream.Read(bytes, 0, bytes.Length);
                    string mstrMessage = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
                    //MessageBox.Show(mstrMessage);
                    e = new StatusChangedEventArgs(mstrMessage);
                    OnStatusChanged(e);
                    //SocketHelper helper = new SocketHelper();
                    //helper.processMsg(tcpClient, stream, bytes);
                    XmlDocument myxmlDoc = new XmlDocument();
                    myxmlDoc.LoadXml(mstrMessage);
                    string message = myxmlDoc.SelectSingleNode("Connect/@message").InnerText;
                    message = Regex.Replace(message, @"\t|\n|\r", "");
                    //MessageBox.Show(message);
                    if (message.Equals("send"))
                    {
                        DriveInfo1 d = new DriveInfo1();
                        string mstrDriveResponse = d.getDrive();
                        byte[]  bytesSent = Encoding.ASCII.GetBytes(mstrDriveResponse);
                        stream.Write(bytesSent, 0, bytesSent.Length);
                        //MessageBox.Show("Received Drive data \n" + mstrDriveResponse);
                        string mstrBuildResponse = d.Installed();
                        byte[] byteSent = Encoding.ASCII.GetBytes(mstrBuildResponse);
                        stream.Write(byteSent, 0, byteSent.Length);
                        //MessageBox.Show("Received Build data \n" + mstrBuildResponse);
                    }
                    else
                    {
                        string mstrResponse = @"<?xml version=""1.0"" encoding=""utf-8""?><Response message=""Unable to parse xml"">";
                        byte[] bytesSent = Encoding.ASCII.GetBytes(mstrResponse);
                        stream.Write(bytesSent, 0, bytesSent.Length);
                    }
                    m = false;
                    stream.Close();
                }
            }
        }
        public void disConnect()
        {
            tcpClient.Close();
            tcpListener.Stop();
        }
    }





请帮助纠正错误!!

谢谢:)



Please help to rectify the error!!
Thanks :)

推荐答案

包含以下代码

include below code
public void disConnect()
{
    if(tcpClient !=null)
    {
        tcpClient.GetStream().Close();
        tcpClient.Close();
        tcpListener.Stop();
    }
}





阅读此KB以获取更多信息:

TcpClient Close方法不会关闭底层TCP连接 [ ^ ]


这篇关于如何断开处于Tcplistener模式的服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆