使用c#

时间:2016-06-16 09:20:25

标签: c# sockets server client client-server

我正在尝试使用c#进行客户端服务器通信。我使客户端和服务器相互通信。但是,我面临的问题是如何停止沟通?

条件:服务器应该一直在监听(当存在多个客户端时)。(目前,我正在使用单个客户端)。客户端应该有一个停止或退出条件(即,当客户端发送“退出”时,客户端应该终止,服务器应该仍然在监听其他客户端)完成传输数据。

我是c#的新手。尝试搜索谷歌也。但没找到我需要的东西。

我的部分代码:

服务器:

        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();
        }

2 个答案:

答案 0 :(得分:0)

使用Socket s = Receiver.AcceptSocket();从客户端接受套接字连接后,您需要将命令处理逻辑放在while (true) { }块中的另一个线程中(使用TaskThread然后你应该再次使用Receiver.AcceptSocket();接受新的套接字连接。

答案 1 :(得分:0)

问题是你做了

Receiver.Stop();

什么时候应该是你要关闭的套接字。

我的想法是你创建一个新的套接字来处理每次客户端连接 - 这是你终止的连接,而不是主侦听套接字。

这里有很好的示例代码:

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