Получите множественный ответ от ошибки клиента, используя TCP в C # - PullRequest
0 голосов
/ 12 мая 2018

Итак, я пытался создать код, в котором TCP будет принимать всех клиентов, включая клиент повторного принятия, но когда я его использую, я не могу получить ответ от клиента, так как мне решить эту проблему?

Окно сообщений даже не появляется на сервере

код для расположения буфера (фоновый работник):

while (true)
{
            try
            {
                client = network.AcceptTcpClient();
                streamer = client.GetStream();
                buffer = new byte[client.ReceiveBufferSize];
            } catch(Exception ex)
            {
                MessageBox.Show(ex.Message,"Client Connection Error");
                client.Close();
                streamer.Close();
                Close();
            }
        }

Код, в котором неправильно отображается окно сообщения, когда клиент отправляет ответ обратно на сервер (фоновый работник):

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        while (true)
        {
            string data = Encoding.Unicode.GetString(buffer, 0, 
streamer.Read(buffer, 0, client.ReceiveBufferSize));
            if (data == "Response_Command_329873123709123")
            {
                int slowdown = streamer.Read(buffer, 0, 
client.ReceiveBufferSize);
                var message = Encoding.Unicode.GetString(buffer, 
0,slowdown);
                worker.ReportProgress(0, message);
            }
        }
    }
    private void backgroundWorker2_ProgressChanged(object sender, 
 ProgressChangedEventArgs e)
    {
        MessageBox.Show((string)e.UserState, "Client Response");
    }

Вот часть кода, где клиент получает ответ от сервера, а затем отправляет серверу сообщение (часть кода, но в основном фокусируется на этом):

else if (data == "Messagebox_Command_2837190092703817203")
            {
                int txtbox = streamer.Read(buffer, 0, 
client.ReceiveBufferSize);
                string txt = Encoding.Unicode.GetString(buffer, 0, txtbox);
                MessageBox.Show(txt, "Message From Server");
                byte[] database = 
Encoding.Unicode.GetBytes("Response_Command_329873123709123");
                streamer.Write(database,0,database.Length);
                byte[] databases = Encoding.Unicode.GetBytes("test");
                streamer.Write(databases, 0, databases.Length);

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я думаю, что ошибка в моей части буфера, но я исправил ее

int databases = streamer.Read(buffers, 0, buffers.Length);
                string data = Encoding.Unicode.GetString(buffers, 0, databases);
                if (data == "Response_Command_329873123709123")
                {
                    byte[] datacen = new byte[client.ReceiveBufferSize];
                    int main = streamer.Read(datacen, 0, datacen.Length);
                    var message = Encoding.Unicode.GetString(datacen, 0, main);
                    MessageBox.Show(message, "Client Response");
                }
0 голосов
/ 12 мая 2018

Нельзя обновить пользовательский интерфейс из потока, не являющегося пользовательским интерфейсом (в данном случае фонового работника).

Изменить:

while(true)
        {
            string data = Encoding.Unicode.GetString(buffer, 0, 
streamer.Read(buffer, 0, client.ReceiveBufferSize));
            if(data == "Response_Command_329873123709123")
            {
                MessageBox.Show(Encoding.Unicode.GetString(buffer, 0, 
streamer.Read(buffer, 0, client.ReceiveBufferSize)), "Client Response");
            }
        }

... на:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

    while(true)
    {
        string data = Encoding.Unicode.GetString(buffer, 0, 
                       streamer.Read(buffer, 0, client.ReceiveBufferSize));
        if(data == "Response_Command_329873123709123")
        {
            var message = Encoding.Unicode.GetString(buffer, 0, 
                                   streamer.Read(buffer, 0, client.ReceiveBufferSize));

            worker.ReportProgress (0,  message);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        MessageBox.Show((string)e.UserState, "Client Response");
    }
...