我需要一些帮助来理解这个C#套接字代码

时间:2015-04-24 17:31:35

标签: c# sockets network-programming

我目前正在尝试使用C#学习网络连接,然后我就开始使用套接字。

我现在读了一些指南,我找到了一个有点好的,可以理解的指南,但是现在他们为我提供了一个用于服务器插件的代码,我对某些段落的理解很困难

代码:

    public void startServer()
    {

        TcpListener serverSocket = new TcpListener(8888);
        TcpClient clientSocket = default(TcpClient);
        serverSocket.Start();
        Console.WriteLine(" >> Server Started");
        clientSocket = serverSocket.AcceptTcpClient();
        Console.WriteLine(" >> Accept connection from client");

        while ((true))
        {
            try
            {
                NetworkStream networkStream = clientSocket.GetStream();
                byte[] bytesFrom = new byte[10025];
                networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                Console.WriteLine(" >> Data from client - " + dataFromClient);
                string serverResponse = "Last Message from client" + dataFromClient;
                Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                networkStream.Write(sendBytes, 0, sendBytes.Length);
                networkStream.Flush();
                Console.WriteLine(" >> " + serverResponse);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        clientSocket.Close();
        serverSocket.Stop();
        Console.WriteLine(" >> exit");
        Console.ReadLine();
    }

首先,很明显一开始就发生了什么。正在创建一个TcpListener,它代表服务器套接字。

然而,混乱有点从TcpClient部分开始。如果这应该是服务器,为什么我必须在这里创建一个客户端?考虑到服务器应该独立运行,不应该将服务器和客户端方法分开吗?

然后,在try catch中,为什么NetworkStream = clientsocket.GetStream();?我可能在这里完全错了,但为什么我必须从我的客户端获取流?这条线听起来像服务器期待定期更新。或者是要传输的信息/消息是否存储在客户端中,直到服务器“收集”它?

字节数组应该存储一条消息,这是我非常肯定的。

我不能真正说出try块中的其他语句,只要我仍然对其他部分感到困惑。但总的来说,服务器在这里建立与客户端的连接,并且双向发送/接收消息。

我在网络或套接字技术方面并不是很先进(说实话,根本不是,我刚开始使用它),所以如果我在这里做了一些非常错误的假设,我很抱歉,但我真的很想得到这段代码,没有任何解释。

如果有人能让我了解这段代码,我会非常感激。

2 个答案:

答案 0 :(得分:1)

对我来说看起来像是一个混合的解决方案。 通常TcpListener listener = new TcpListener(8888)等待给定端口上的连接。

然后,当它接受来自客户端的连接时,它会在不同的套接字Socket socket = listener.AcceptSocket()上建立连接,以便侦听端口仍在等待其他连接(另一个客户端)。

然后,我们可以从流中的客户端读取:Stream stream = NetworkStream(socket)

TcpClient用于连接到此类服务器,它应该在客户端应用程序中使用,而不是在服务器应用程序中使用。

答案 1 :(得分:0)

术语客户有两个定义。在应用程序级别,您有一个客户端和服务器应用程序。客户端是主服务器,服务器是从服务器。在套接字级别,客户端应用程序和服务器应用程序都有一个客户端(也称为套接字)。 服务器套接字侦听环回地址127.0.0.1(或IPAny)。客户端套接字连接到服务器IP地址。