首页 文章

C#异步套接字 - 获取数据

提问于
浏览
-1

我正在构建一个简单的服务器,它包含一些信息,并将使用异步套接字来获取N个连接(我真的不知道有多少,它们的范围可以从50到1000) .

此服务器的主要目的是“验证”连接的客户端的文件完整性和版本,并在需要时向他们发送更新的文件,以便他们可以进行修补 .

现在,我正在让我的套接字运行,我可以在控制台中显示数据,一切都很好,问题是,我最重要的变量是在我的'DownloadServer'类上,而我的套接字函数是打开的一个名为'ServerSocket'的类 .

我的问题是,当我的套接字请求所述信息时,如何访问DownloadServer中的数据(包含ServerSocket的实例) . 我无法返回使用Async Callbacks收到的数据(因为它们必须无效),那么最好的方法是什么呢?

这是我的套接字代码,它只接收客户端并打印发送的数据 . 我想要做的是访问收到的信息(例如,同样的命令)并返回给客户端请求信息,例如,如果收到的消息是“GetFileVersion”,服务器应该回复变量的值它包含(它是一个名为FILEVERSION的全局变量),这是我似乎无法找到访问该变量的方法的问题 .

class ServerSocket
 {
    private Socket _socket;
    private byte[] _buffer;
    public ServerSocket()
    {
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

    public void bind(int port)
    {
        _socket.Bind(new IPEndPoint(IPAddress.Any, port));
    }

    public void Listen(int backlog)
    {
        _socket.Listen(backlog);
    }

    public void Accept()
    {
        _socket.BeginAccept(AcceptCallBack, null);
    }

    private void AcceptCallBack(IAsyncResult ar)
    {

        Socket clientSocket = _socket.EndAccept(ar);
        Accept();
        IPEndPoint clientEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
        Console.WriteLine("Client Connected: {0}",clientEndPoint.Address.ToString());
        _buffer = new byte[2048];
        clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, clientSocket);



    }

    private void ReceivedCallback(IAsyncResult ar)
    {
        try
        {
            Socket clientSocket = ar.AsyncState as Socket;
            int size = clientSocket.EndReceive(ar);
            byte[] packet = new byte[size];
            Array.Copy(_buffer, packet, packet.Length);
            String data = System.Text.Encoding.ASCII.GetString(packet, 0, packet.Length);



        }
        catch (Exception ex)
        {
            ;
        }

    }



 }
}

先感谢您!

编辑:我想做的是像String commandReceived = socket.Receive()(就像你使用同步套接字),或通过该套接字接收该命令的某种方式 .

class DownloadServer
{
    private static String UPDATEPATH="";
    private static int FILEVERSION;
    private static string ROOTPATH = "";
    private String SQLUsername = "";
    private String SQLPassword = "";
    private String AccountDB = "";
    private String ServerName = "";
    private SqlConnection sqlConn;

//some logic methods

static void Main(string[] args){
ServerSecurity serverSecurity = new ServerSecurity();
        ServerSocket serverSocket = new ServerSocket();
        serv.Initialize();
        serverSecurity.Initialize();
        serverSocket.bind(15779);
        serverSocket.Listen(1000);
        serverSocket.Accept();

        while (true)
        {
            Console.WriteLine("Input the command:");
            var Input = Console.ReadLine();

            if (Input == "Update")
            {
                serv.prepareUpdate();
            }
            else if (Input == "Exit")
            {
                Environment.Exit(0);
            }
            else if (Input == "TestEncryption")
            {
                Console.WriteLine("Enter the text to be encrypted:");
                String plainText = Console.ReadLine();
                Console.WriteLine("Original Text = {0}", plainText);
                Console.WriteLine("Encrypted Text = {0}", serverSecurity.Encrypt(plainText));
                Console.WriteLine("Decrypted Text = {0}", serverSecurity.Decrypt(serverSecurity.Encrypt(plainText)));
            }
        }

    }

2 回答

  • 0

    添加您的DownloadServer类:

    Socket NewSocket;
    byte[] buffer = new buffer [1024];
    NewSocket = serverSocket.Accept();
    

    然后从这个NewSocket开始接收:

    void Receive()
    {
     NewSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, r);
    }
    
    
    
     private void ReceiveCallback(IAsyncResult ar)
            {
                Socket CurrentClient = (Socket)ar.AsyncState;
                int Received;
                try { Received = CurrentClient.Receive(buffer); }
                catch
                {
                    return;
                }
    
    
                byte[] _buffer = new byte[Received];
                Array.Copy(buffer, _buffer, Received);
                string _Text = Encoding.Unicode.GetString(_buffer);
    
               if(_Text == "GetVersion")
                byte[] infoVersion = Encoding.Encoding.Default.GetBytes(FILEVERSION);
                  CurrentClient .Send(infoVersion )
    }
    
  • 0

    这看起来像是一个经典的设计问题,你试图给一个类太多的责任 . 在SOLID设计中,每个 class 都应该承担一项责任 . 然后,SocketServer将负责创建套接字和发送/接收数据 . 您的DownloadServer将负责创建要发送的数据 . 另一个类说ValidationServer,负责通过SocketServer请求数据并解析它 . 如果你愿意,第三类,一个控制器,将负责协调调用和在这些类之间传递数据 . 通过这种方式,您的SocketServer和DownloadServer将被解耦,并且不需要彼此的变量 .

相关问题