1

私はクライアントサーバーマルチスレッドアプリケーションに取り組んでいます:

通信の進行状況は次のとおりです。

  1. サーバーはソケットでリッスンします
  2. クライアントが接続し、リクエストをサーバーに送信します
  3. 各リクエストは 0x04 で終了
  4. サーバーは、着信要求よりも遅い操作で各要求を処理する必要があります

「ProcessClient」メソッドに問題があり、短時間に 2 つのリクエストが発生し、2 番目のリクエストが処理されるため、メソッドの最後まで最初のリクエストを処理できません。foreach ループの後に問題が発生します。

            foreach (var t in invoices)
            {
                SaveToDataBase(t);
            }

メソッドは最後まで実行されず、次のコード スニペットでクライアントに応答を送信しません。

            var ResponseFile = ResponseClientFolder + "\\" + ResponseClientFileName + x + ".txt";
            StreamWriter sw = File.CreateText(ResponseFile);
            sw.WriteLine(_odgovor);
            sw.Close();
            _odgovor = string.Empty;
            SendToClient(ResponseFile);

2 番目のリクエストは「ProcessClient」メソッドで発生するためです。

この問題を解決する方法はありますか。私は成功せずに多くの解決策を探していました。

コード全体は以下のとおりです。

    private void RunListener()
    {
        try
        {
            _listener = new TcpListener(IPAddress.Parse(ServerAddres), ServerPort);
            _listener.Start();
            while (true)
            {
                TcpClient client = _listener.AcceptTcpClient();
                Invoke(new Action(() => { }));
                ThreadPool.QueueUserWorkItem(ProcessClient, client);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, @"Run listener");
        }
    }


    private void ProcessClient(object state)
    {
        try
        {
            byte[] bytes = new byte[1024];
            TcpClient client = state as TcpClient;
            StringBuilder completeMessage = new StringBuilder();

            if (client == null) return;

            networkStream = client.GetStream();
            int bytesRead = 0;
            do
            {
                bytesRead = networkStream.Read(bytes, 0, bytes.Length);
                completeMessage.AppendFormat("{0}", Encoding.Default.GetString(bytes, 0, bytesRead));
            } while (bytesRead > 0 && bytes[bytesRead - 1] != 0x04);

            completeMessage = completeMessage.Replace(@"”", "");

            string datetime = DateTime.Now.ToString();
            var x = datetime.Replace(".", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty);
            var inputfilename = "Racun" + x + ".txt";

            StreamWriter sws = File.CreateText(inputfilename);
            sws.WriteLine(completeMessage);
            sws.Close(); 
            string data = completeMessage.ToString();
            char[] delimiters = { '\r', '\n' };
            string[] invoices = data.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

            foreach (var t in invoices)
            {
                SaveToDataBase(t);
            }

            var ResponseFile = ResponseClientFolder + "\\" + ResponseClientFileName + x + ".txt";
            StreamWriter sw = File.CreateText(ResponseFile);
            sw.WriteLine(_odgovor);
            sw.Close();
            _odgovor = string.Empty;
            SendToClient(ResponseFile);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, @"Proces client");
        }
    }

    private void SendToClient(string ResponseFile)
    {
        try
        {
            byte[] byteData = File.ReadAllBytes(ResponseFile);
            List<byte> byteDat = new List<byte>();
            byteDat.AddRange(byteData);
            byteDat.Add(0x04);

            byteData = byteDat.ToArray();
            networkStream.Write(byteData, 0, byteData.Length);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, @"Send to client");
        }
    }
4

0 に答える 0