繁体   English   中英

C#TCP服务器进行简单聊天

[英]C# TCP Server for simple chat

我正在使用Microsoft提供的Async示例编写第一台TCP服务器。

https://msdn.microsoft.com/zh-CN/library/fx6588te(v=vs.110).aspx

我可以从示例中进行所有操作。 我将其扩展为一个简单的聊天程序。 但是我在遵循该程序的步骤时遇到了麻烦(可能是由于其异步特性)。 收到消息后,它将回显到客户端并关闭套接字。 我看不到重新打开插座的位置。

public static void StartListening() {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        // The DNS name of the computer
        // running the listener is "host.contoso.com".
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );

        // Bind the socket to the local endpoint and listen for incoming connections.
        try {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true) {
                // Set the event to nonsignaled state.
                allDone.Reset();

                // Start an asynchronous socket to listen for connections.
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept( 
                    new AsyncCallback(AcceptCallback),
                    listener );

                // Wait until a connection is made before continuing.
                allDone.WaitOne();
            }

        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }

        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();

    }

private static void SendCallback(IAsyncResult ar) {
        try {
            // Retrieve the socket from the state object.
            Socket handler = (Socket) ar.AsyncState;

            // Complete sending the data to the remote device.
            int bytesSent = handler.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to client.", bytesSent);

            handler.Shutdown(SocketShutdown.Both);
            handler.Close();

        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
    }

另外,保持插座打开不正常吗?

收到消息后,它将回显到客户端并关闭套接字。 我看不到重新打开插座的位置。

那是因为事实并非如此。 通信完成,服务器接收,发送答复,并完成该连接。 它只是继续等待侦听套接字上的新连接。 您有一段时间(是)。 您将继续在accept呼叫中等待新的传入连接。 您将为每个新客户端获得一个新套接字。

另外,将插座打开是不正常的

是的,监听插槽保持打开状态。 它保持打开状态以继续使用accept接收新连接

可以在这里找到使用async和await编写回显服务器的更好方法: 使用.Net 4.5异步特性进行套接字编程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM