簡體   English   中英

使用C#停止客戶端服務器中的通信

[英]Stopping communication in client server using c#

我正在嘗試使用c#進行客戶端服務器通信。我已經使客戶端和服務器相互通信。 但是,我面臨的問題是如何停止通信?

條件:服務器應始終在偵聽(如果存在多個客戶端)。(目前,我正在使用單個客戶端)。 客戶端應具有停止或退出條件(即,當客戶端發送“退出”時,客戶端應終止,服務器應仍在偵聽其他客戶端),當它完成數據傳輸時。

我是C#的新手。 也嘗試過在Google上搜索。 但沒有找到我所需要的。

我的部分代碼:

服務器:

        try
        {
            IPAddress addr = IPAddress.Parse("127.0.0.1");
            string a = "recieved by server";
            TcpListener Receiver = new TcpListener(addr, 1234);
            Receiver.Start();
            Console.WriteLine("trying to connect to " + addr);
            Socket s = Receiver.AcceptSocket();
            Console.WriteLine("Connected");
            while (true)
            {
                byte[] b = new byte[100];
                int k = s.Receive(b);
                char[] chars = new char[b.Length / sizeof(char)];
                System.Buffer.BlockCopy(b, 0, chars, 0, b.Length);
                string dataReceived = new string(chars);
                Console.WriteLine(dataReceived);
                byte[] bw = new byte[a.Length * sizeof(char)];
                System.Buffer.BlockCopy(a.ToCharArray(), 0, bw, 0, bw.Length);
                Console.WriteLine("sending Acknowledgement to client");
                s.Send(bw);
            }

            //Receiver.Stop();
        }

客戶:

        try
        {
            TcpClient TcpC = new TcpClient();
            TcpC.Connect("127.0.0.1", 1234);
            while (true)
            {
                Console.WriteLine("enter somethiong to send");
                String s = Console.ReadLine();
                NetworkStream CStream = TcpC.GetStream();
                byte[] bw = new byte[s.Length * sizeof(char)];
                System.Buffer.BlockCopy(s.ToCharArray(), 0, bw, 0, bw.Length);
                Console.WriteLine("Transmit");
                CStream.Write(bw, 0, bw.Length);
                if (s == "exit")
                {
                    CStream.Flush();
                    CStream.Close();
                    TcpC.Close();
                    break;
                }
                byte[] br = new byte[100];
                int k = CStream.Read(br, 0, 100);
                char[] chars = new char[br.Length / sizeof(char)];
                System.Buffer.BlockCopy(br, 0, chars, 0, br.Length);
                string ackReceived = new string(chars);
                Console.WriteLine(ackReceived);
            }

            //TcpC.Close();
        }

一旦您使用Socket s = Receiver.AcceptSocket();接受來自客戶端的套接字連接, Socket s = Receiver.AcceptSocket(); 您需要將命令處理邏輯放在另一個線程(同時使用TaskThread )的while (true) { }塊中,然后應該使用Receiver.AcceptSocket();開始接受新的套接字連接Receiver.AcceptSocket(); 再次。

問題是你做一個

Receiver.Stop();

當它應該是您要關閉的套接字時。

這個想法是您創建一個新的套接字來處理每次客戶端連接的情況-這是您終止的連接,而不是主監聽套接字。

這里有很好的示例代碼:

https://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcplistener(v=vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM