3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
1

Многопоточный запрос у сервера

30.09.2021, 22:23. Показов 2991. Ответов 21

Author24 — интернет-сервис помощи студентам
Всем здравствуйте! Нужна помощь в состыковке всех методов. Я взял тестовое задание на вакансию c# программиста, просто, чтобы поработать с настоящим заданием, на саму вакансию не претендую.

Задание звучит так: По tcp\ip подключиться к серверу и отправить на него стрингом число от 1 до, условно, 500. На каждое присланное число сервер присылает целое число в диапазоне от 0 до 1е7 и по бокам от этого числа еще всякий мусор, символы там, точки. Нужно получить все числа и вычислить медиану.

Проблема в том, что каждое число сервер присылает с задержкой. Я, в целом, сделал всё, кроме многопоточности. Я пытаюсь реализовать это через async-await, но понимаю, что опыта мало, потому обращаюсь к вам. Как мне одновременно запрашивать несколько таких чисел у сервера с их последующей обработкой? Общую схему вижу такую:

5 асинк методов, которые отправляю числа от 1 до 500, каждый отвечает за свой диапазон чисел. Скажем, первый метод в цикле for отправляет числа от 1 до 100, второй от 101 до 200 и так далее. Каждое полученное число фильтруется через регулярные выражения, где отрезается весь мусор по бокам, само число конвертируется в инт и отправляется в общий массив. После выполнения всех 5 методов с их циклами уже в Мэйне весь массив сортируется и вычисляется медиана, так же все числа массива записываются в файл, но это уже чисто для меня.

Я понимаю, что скорее всего что-то упускаю, потому прошу, не откажите, покажите верный путь. Мой код кидает эксепшн: "Unable to read data from the transport connection: Программа на вашем хост-компьютере разорвала установленное подключение..."

Прикладываю код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
namespace ConsoleApp1
{
   namespace ConsoleApp1
{
    class Program
    {
        static int[] numList = new int[2018];
        private const int port = 2013;
        private const string server = "xxx.xxx.xxx.xxx";
        static TcpClient client = new TcpClient();
 
        static void Main(string[] args)
        {
            
            client.Connect(server, port);
            request2();
 
            foreach (var item in numList)
            {
                File.AppendAllText("FileONE.txt", item.ToString());
            }
 
                // Закрываем потоки
 
            client.Close();
                
           
            Console.WriteLine("Запрос завершен...");
            Console.ReadKey();
        }
        public async static void request2()
        {
            for (int i = 1; i <= 2018; i+=5)
            {
                await Task.Run(() =>
                {
                    //sending a string
                    NetworkStream streamSend = client.GetStream();
                    StreamWriter writer = new StreamWriter(streamSend);
                    writer.WriteLine(i.ToString() + "\n");
                    writer.Flush();
 
                    //getting a string
                    NetworkStream stream = client.GetStream();
                    StreamReader reader = new StreamReader(stream);
                    string message = reader.ReadLine();
 
                    //filtering out
                    string regex = message;
                    string pattern = @"\d+";
                    Regex rg = new Regex(pattern);
                    MatchCollection match = rg.Matches(regex);
 
                    int result = Convert.ToInt32(match[0].Value);
                    Console.WriteLine(result);
 
                    numList[i] = result;
               });
               
            }
        }
 
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2021, 22:23
Ответы с готовыми решениями:

Многопоточный пост запрос
Делаю многопоточные Пост запросы на страничку используя для синхронизации lock. Проблема в том если...

При каких сценариях можно увидеть различия в следующих реализациях сервера: однопоточный, многопоточный
Доброго времени суток! Подскажите, пожалуйста, при каких сценариях можно увидеть различия в...

Не отправляется запрос с сервера
Проект имеет API на сервере api.domain.info и сам клиент на domain.info. Клиент написан на Angular...

POST запрос на Api сервера
Привет. Хочу реализовать на пайтоне отправку запроса на апи сервера. Какой модуль нужен для...

21
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
01.10.2021, 13:47  [ТС] 2
Удалось немного сдвинуться с места. Сейчас не понимаю, почему при выполнение задачи, я от сервера получаю стринг кусками то количество раз, сколько работает цикл. То есть, отправить еще какое-то число не удается.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  private const int port = 2013;
        private const string server = "***.***.***.***";
                
        static void Main(string[] args)
        {
            int[] numList = new int[2018];
            var tasks = new List<Task>();
            TcpClient client = new TcpClient();
            client.Connect(server, port);
            
            for (int i = 2; i < 3; i++) //for (int i = 2; i < 4; i++)
            {
                Task.Run(() =>
                {
                    NetworkStream streamSend = client.GetStream();
                    StreamWriter writer = new StreamWriter(streamSend);
                    NetworkStream stream = client.GetStream();
                    StreamReader reader = new StreamReader(stream);
 
                    //отправление сообщения
 
                    writer.WriteLine(i.ToString() + "\n");
                    writer.Flush();
 
                    //прием сообщения
 
                    string message = reader.ReadLine();
 
 
                    //обрабатываем строку
                    string regex = message;
                    string pattern = @"\d+";
                    Regex rg = new Regex(pattern);
                    MatchCollection match = rg.Matches(regex);
 
                    int result = Convert.ToInt32(match[0].Value);
                    Console.WriteLine("Число под номером " + i + ":" + result);
                    Console.WriteLine(message);
                    numList[i] = result;
                    //File.AppendAllText("File.txt", result.ToString() + "\n");
 
                    writer.Close();
                    reader.Close();
                });
 
            }                     
           
            Console.WriteLine("Запрос завершен...");
            Console.ReadKey();
 
 
        }

Вот результат в консоли:
Когда выполняю цикл один раз:
Код
Число под номером 3:8161576
.........8161576...     ..      ......
Когда выполняю 2 раза:
Код
Число под номером 4:8633
..8633....      .
Число под номером 4:123
..123.. .       .       By the Holy Light! Unrecognized input line. Please check input string.
Видно, что происходит что-то неладное с i. Оно становится тем числом, которым становиться не должно.
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
01.10.2021, 22:16  [ТС] 3
Следующий шаг в выполнении задачи:

Смог сделать, вроде бы, многопоточные запросы, для начала сделал 3 метода, каждый запрашивает по 10 цифр. Столкнулся с тем, что иногда вылетает экспешн и я не знаю как его обработать, чтобы код продолжал выполняться.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using System;
using System.IO;
using System.Net.Sockets;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
 
namespace ConsoleApp1
{
    class Program
    {
        static int[] numList = new int[2018];
        private const int port = хххх;
        private const string server = "***.***.***.***";
        
        
        static void Main(string[] args)
        {
            
            var tasks = new List<Task>();
 
 
 
 
            new Thread(() => { request2(); }).Start();
            new Thread(() => { request3(); }).Start();
            new Thread(() => { request4(); }).Start();
 
 
            // Закрываем потоки
 
            Console.WriteLine("Запрос завершен...");
            Console.ReadKey();
 
        }
        public static void request2()
        {
            for (int i = 1; i <=10; i++)
            {
 
                //отправление сообщения
                TcpClient client = new TcpClient();
            client.Connect(server, port);
            NetworkStream streamSend = client.GetStream();
                    StreamWriter writer = new StreamWriter(streamSend);
                    string request = i.ToString() + "\n";
                    writer.WriteLine(request);
                    writer.Flush();
 
                    //прием сообщения
                    NetworkStream stream = client.GetStream();
                    StreamReader reader = new StreamReader(stream);
                    string message = reader.ReadLine();
 
 
            //обрабатываем строку
            string regex = message;
            string pattern = @"\d+";
            Regex rg = new Regex(pattern);
            MatchCollection match = rg.Matches(regex);
            //Console.WriteLine(regex);
            int result = Convert.ToInt32(match[0].Value);
            Console.WriteLine("Число под номером " + i + ": " + result);
                numList[i] = result;
                File.AppendAllText("File2.txt", "Число под номером " + i + ": " + result + "\n");
                reader.Close();
            writer.Close();
            client.Close();
            
 
        }
    }
 
        public static void request3()
        {
            for (int i = 11; i <= 20; i++)
            {
 
                //отправление сообщения
                TcpClient client = new TcpClient();
            client.Connect(server, port);
            NetworkStream streamSend = client.GetStream();
            StreamWriter writer = new StreamWriter(streamSend);
            string request = i.ToString() + "\n";
            writer.WriteLine(request);
            writer.Flush();
 
            //прием сообщения
            NetworkStream stream = client.GetStream();
            StreamReader reader = new StreamReader(stream);
            string message = reader.ReadLine();
 
 
            //обрабатываем строку
            string regex = message;
            string pattern = @"\d+";
            Regex rg = new Regex(pattern);
            MatchCollection match = rg.Matches(regex);
            //Console.WriteLine(regex);
            int result = Convert.ToInt32(match[0].Value);
            Console.WriteLine("Число под номером " + i + ": " + result);
                File.AppendAllText("File3.txt", "Число под номером " + i + ": " + result + "\n");
                reader.Close();
            writer.Close();
            client.Close();
 
 
                numList[i] = result;
 
            }
        }
 
        public static void request4()
        {
            for (int i = 21; i <= 30; i++)
            {
 
                //отправление сообщения
                TcpClient client = new TcpClient();
                client.Connect(server, port);
                NetworkStream streamSend = client.GetStream();
                StreamWriter writer = new StreamWriter(streamSend);
                string request = i.ToString() + "\n";
                writer.WriteLine(request);
                writer.Flush();
 
                //прием сообщения
                NetworkStream stream = client.GetStream();
                StreamReader reader = new StreamReader(stream);
                string message = reader.ReadLine();
 
 
                //обрабатываем строку
                string regex = message;
                string pattern = @"\d+";
                Regex rg = new Regex(pattern);
                MatchCollection match = rg.Matches(regex);
                //Console.WriteLine(regex);
                int result = Convert.ToInt32(match[0].Value);
                Console.WriteLine("Число под номером " + i + ": " + result);
                File.AppendAllText("File4.txt", "Число под номером " + i + ": " + result + "\n");
                reader.Close();
                writer.Close();
                client.Close();
 
 
                numList[i] = result;
 
            }
        }
 
 
    }
}
Эксепшн:
Код
System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values. Arg_ParamName_Name'

на строке метода такой:
int result = Convert.ToInt32(match[0].Value);
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
01.10.2021, 23:38 4
Цитата Сообщение от magrega Посмотреть сообщение
System.ArgumentOutOfRangeException
Значит этого элемента нет match[0]

Добавлено через 3 минуты
Добавьте
C#
1
2
if (match.Count != 0)
   int result = Convert.ToInt32(match[0].Value);
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
01.10.2021, 23:53  [ТС] 5
ipsorokin, это скорее всего происходит, потому что по каким-то причинам сервер не дает цифру в ответ на запрос. Как я понял, мне нужно обработать этот эксепшн так, что если он случается, он должен ту же цифру запросить еще раз.
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 15:55  [ТС] 6
Окей, двигаемся по-тихоньку. Новая проблема: стринг ответа от сервера иногда приходит в обрезанном виде, то есть я получаю не целое число 76478347, а 764. Это происходит рандомно и я не знаю почему. Может быть буфер переполняется и новая информация обрезается?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
static void Main(string[] args)
        {
 
            var tasks = new[]
            {
                Task.Factory.StartNew(() => Request1(1,10)),
                Task.Factory.StartNew(() => Request1(11,20)),
                //Task.Factory.StartNew(() => Request1(21,30)),
                //Task.Factory.StartNew(() => Request1(31,40)),
                //Task.Factory.StartNew(() => Request1(41,50)),
               
                
               // Task.Factory.StartNew(() => request3()),
               //Task.Factory.StartNew(() => request4()),
               //Task.Factory.StartNew(() => request2())
        };
            Task.WaitAll(tasks);
            
 
            Console.WriteLine("Request complete...");
          
            Console.ReadKey();
 
        }
 
        public static void Request1(int start, int end)
        {
            
 
            for (int i = start; i <= end; i++)
            {
                try
                {
                    //отправление сообщения
                    TcpClient client = new TcpClient();
                    client.Connect(server, port);
                    NetworkStream streamSend = client.GetStream();
                    StreamWriter writer = new StreamWriter(streamSend);
                    string request = i.ToString() + "\n";
                    writer.WriteLine(request);
                    writer.Flush();
 
                    //прием сообщения
                    NetworkStream stream = client.GetStream();
                    StreamReader reader = new StreamReader(stream);
                    string message = reader.ReadLine();
 
 
                    //обрабатываем строку
                    string regex = message;
                    string pattern = @"\d+";
                    Regex rg = new Regex(pattern);
                    MatchCollection match = rg.Matches(regex);
                    //Console.WriteLine(regex);
                    int result = Convert.ToInt32(match[0].Value);
                    Console.WriteLine("Number " + i + ": " + result);
                    numList[i] = result;
                    File.AppendAllText("File2.txt", "Number " + i + ": " + result + "\n");
                    
                    reader.Close();
                    writer.Close();
                    client.Close();
                }
 
                catch
                {
                    Console.WriteLine("Error in number " + i + ". Retrying...");
                    i--;
 
                }
 
            }
 
            //File.AppendText("File2.txt", "Число под номером " + i + ": " + result + "\n");
 
            
        }
Добавлено через 16 минут
Известно, что ответ от сервера приходит в виде стринга с числом посередине, с символом line feeder в конце и с любым количеством мусора по бокам от числа. Я все это дело фильтрую через регулярку, чтобы получить число, но иногда приходит неполный стринг и я не знаю, как это обрабатывать.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 21:36 7
Лучший ответ Сообщение было отмечено magrega как решение

Решение

Оно?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    class Program
    {
        static void Main(string[] args)
        {
            Server server = new(default, default);
            server.StartAsync();
            Console.ReadLine();
        }
    }
 
    public class Server
    {
        TcpListener tcpListener;
        string server = "127.0.0.1";
        int port = 55500;
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.abdcefgijklmnopqrstuvwxyz_-";
 
        public Server(string server, int port)
        {
            this.server = string.IsNullOrWhiteSpace(server) ? this.server : server;
            this.port = port == 0 ? this.port : port;
        }
 
        public async Task StartAsync()
        {
            tcpListener = new TcpListener(IPAddress.Parse(server), port);
            tcpListener.Start();
            try
            {
                while (true)
                {
                    TcpClient client = await tcpListener.AcceptTcpClientAsync();
 
                    new Thread(new ThreadStart(() =>
                    {
                        NetworkStream stream = client.GetStream();
                        StreamReader sr = new(stream);
                        StreamWriter sw = new(stream);
 
                        string str = genRandom(Convert.ToInt32(sr.ReadLine()));
                        sw.WriteLine(str);
                        sw.Flush();
                        Console.WriteLine("{0}: {1}", Thread.CurrentThread.ManagedThreadId, str);
                    })).Start();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                tcpListener.Stop();
            }
        }
 
        private string genRandom(int i)
        {
            Random random = new();
            var str = new string(Enumerable.Repeat(chars, i).Select(s => s[random.Next(s.Length)]).ToArray());
            str += random.Next(1, 9999);
            str += new string(Enumerable.Repeat(chars, 5).Select(s => s[random.Next(s.Length)]).ToArray());
            return str;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    class Program
    {
        static async Task Main(string[] args)
        {
            int i = 0;
            Random random = new Random();
            while (i++ < 20)
            {
                Task.Run(() => new Client(default, default).SendAsync(random.Next(10, 50).ToString()));          
            }
            Console.ReadLine();
        }
    }
 
    public class Client
    {
        string server = "127.0.0.1";
        int port = 55500;
        Regex regex = new(@"\d+");
 
        public Client(string server, int port)
        {
            this.server = string.IsNullOrWhiteSpace(server) ? this.server : server;
            this.port = port == 0 ? this.port : port;
        }
 
        public async void SendAsync(string message)
        {
            TcpClient client = new();
            client.Connect(IPAddress.Parse(server), port);
            NetworkStream stream = client.GetStream();
            StreamReader sr = new(stream);
            StreamWriter sw = new(stream);
            sw.WriteLine(message);
            sw.Flush();
            var strR = sr.ReadLine();
            var reg = regex.Match(strR);
 
            Console.WriteLine("{0} => {1}", reg, strR);
        }
    }
1
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 21:49  [ТС] 8
Похоже на то, тестирую, возвращаются ли нормальные стринги. Почему оно так быстро запросы делает? У меня гораздо медленнее работает.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 21:56 9
Сервер ждёт подключение. После того как клиент подключается, он сразу передает его в другой поток и ждет следующее подключение.
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 22:05  [ТС] 10
Ну вот тут видно, что стринг какой-то кривой прилетает. Сервер не мой, к сожалению.

Код
 => .
 => ..  ..
 => ..          ...
8161576 =>      ..      8161576........
8120765 => .....8120765.                .               .
8161149 =>              ......  .8161149....
8233714 => .......8233714....
8128541 => ..                   ...8128541.     ..
8113652 => ....8113652..        ...
8120765 => ..   .8120765..              ......
8233714 => ....8233714. ..
8233714 => ....                 8233714...      ...
8161149 => ..   .               ........8161149.        .       .
8120765 => ...  8120765........                 ..
8161149 => .......              ...     8161149..
8161306 => ...  8161306 ........                .
8113652 => ..   ....8113652     .....           ..
8161149 => .....        ...                     .8161149        ....
8161576 => .    ..      .....8161576..  ..                      .
8127334 => ...  ....    .....8127334.   .       ....    .....
Добавлено через 9 минут
ipsorokin, очень интересно понять, что вот тут происходит:

C#
1
2
3
4
5
 public Client(string server, int port)
        {
            this.server = string.IsNullOrWhiteSpace(server) ? this.server : server;
            this.port = port == 0 ? this.port : port;
        }
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 22:11 11
Цитата Сообщение от magrega Посмотреть сообщение
очень интересно понять, что вот тут происходит
C#
1
2
3
4
5
6
7
public Client(string server, int port)
{
    if (!string.IsNullOrWhiteSpace(server))
       this.server= server;
    if (port != 0)
       this.port = port;
}
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 22:19  [ТС] 12
ipsorokin, Даже с вашим замечательно придуманным кодом я ловлю эти корявые стринги. Я очень хочу понять в чем дело. Может быть дело на сервере, но я не могу это проверить.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 22:26 13
Ну как я понял из этого
Код
 => .
 => ..  ..
 => ..          ...
8161576 =>      ..      8161576........
8120765 => .....8120765.                .               .
8161149 =>              ......  .8161149....
8233714 => .......8233714....
8128541 => ..                   ...8128541.     ..
8113652 => ....8113652..        ...
8120765 => ..   .8120765..              ......
8233714 => ....8233714. ..
8233714 => ....                 8233714...      ...
8161149 => ..   .               ........8161149.        .       .
8120765 => ...  8120765........                 ..
8161149 => .......              ...     8161149..
8161306 => ...  8161306 ........                .
8113652 => ..   ....8113652     .....           ..
8161149 => .....        ...                     .8161149        ....
8161576 => .    ..      .....8161576..  ..                      .
8127334 => ...  ....    .....8127334.   .       ....    .....
Числа же находит, так что какая разница какие строки посылает какой-то левый сервер.

Добавлено через 1 минуту
C#
1
2
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.abdcefgijklmnopqrstuvwxyz_-"; // заменить на
const string chars = ". "; // это
И должно быть так же.
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 22:29  [ТС] 14
ipsorokin, проблема в том, что иногда в эти покромсанные стринги попадает часть числа, и тогда число какое-то становится неправильным.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 22:31 15
Цитата Сообщение от magrega Посмотреть сообщение
попадает часть числа
Это как?
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
02.10.2021, 22:52  [ТС] 16
ipsorokin, ну вот я многократно отправил число 21. В начале видно, что есть лишь кусок этого числа - 407. И такое бывает не в начале потока запросов, это может случиться в любой момент.
Код
Number 21:
 => .......
Number 21:
407 => ..               .407
Number 21:
 => .....
Number 21:
4077718 =>      ..      ..              .4077718..              .
Number 21:
4077718 => ......       .       .       ..4077718..
Number 21:
4077718 => .....4077718.        ..
Number 21:
4077718 => ..   ....4077718..   ....
Number 21:
4077718 => ....4077718...       .....
Number 21:
4077718 =>                      ...     ...             .4077718.               .
Number 21:
4077718 => ..   ....    .       .4077718        ..      ....
Number 21:
4077718 =>              .       ......4077718....       ..
Number 21:
4077718 => ......                       .....4077718..          .
Number 21:
4077718 => .    ...     ...     ..4077718       .       ..      .       ..
Number 21:
4077718 => .    .....   ..      .4077718
Number 21:
4077718 => ........4077718......        .
Number 21:
4077718 =>                              .....   4077718...      ..              .       .
Number 21:
4077718 => .....                .4077718....... ....
Number 21:
4077718 =>      ....    ..4077718.......        ...     .
Number 21:
4077718 =>              ..      ...             ...4077718.             ..      .                       ....
Number 21:
4077718 => .    ...     .       .....   4077718....             ......
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
03.10.2021, 12:11  [ТС] 17
ipsorokin, я немного адаптировал ваш код и сейчас не могу понять, почему я не вижу все цифры в консоли, а некоторые еще и повторяются. Здесь я по сути каждый раз инкрементируя number, посылаю на сервер числа от 1 до 20, но в консоли это:

Код
 => ..          ....
 => ........    ..
5094429 => ...  .5094429
5094429 =>      .       ......5094429   .               .
5 => .  ....    .5
5094429 =>      .....5094429            .....
5094429 => ....                 ..      ...     5094429..
5094429 => ....5094429........
5094429 => ....         5094429....     ...
5094429 => ..   ...     ..      .5094429...     ..
5094429 => ...  .........       5094429.        ..      ..
5094429 =>              ..              ..      ...5094429      ..              ...             ..
5094429 => ...........          .5094429        ......
5094429 =>      ...........5094429              .....
5094429 => .....        ........5094429...              .       .
5094429 => ...  ...     ..              ..5094429.......        ...
5094429 => .    .....   .       .       .5094429...     .....   ..
5094429 => ..   ..              .5094429..                      .       .
5094429 => .........5094429..   ..      .......
5094429 => ......               ....    .5094429...     .       ....            .
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Program
    {
        static async Task Main(string[] args)
        {
            int number = 1;
            int i = 0;
            while (i++ < 20)
            {
                Task.Run(() => new Client(default, default).SendAsync(number.ToString()));
                number++;
            }
            
            
            
            Console.ReadLine();
        }
    }
 
    public class Client
    {
        string server = "ххх.ххх.ххх.ххх";
        int port = ***;
        Regex regex = new(@"\d+");
 
        public Client(string server, int port)
        {
            if (!string.IsNullOrWhiteSpace(server))
                this.server = server;
            if (port != 0)
                this.port = port;
        }
 
        public async void SendAsync(string message)
        {
            TcpClient client = new();
            client.Connect(IPAddress.Parse(server), port);
            NetworkStream stream = client.GetStream();
            StreamReader sr = new(stream);
            StreamWriter sw = new(stream);
            sw.WriteLine(message);
            sw.Flush();
            var strR = sr.ReadLine();
            var reg = regex.Match(strR);
            Console.WriteLine("{0} => {1}", reg, strR);
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 12:53 18
Откуда ж мне знать, что там за сервер такой и почему шлет одно и то же число.
0
3 / 3 / 2
Регистрация: 30.06.2012
Сообщений: 319
03.10.2021, 13:13  [ТС] 19
ipsorokin, Извините, что донимаю, просто интересно докопаться до истины. Мне кажется, что просто до того, как сервер начинает отвечать, цикл уже доходит до i = 20. Я знаю точно, что ответ на цифру 20 должен быть 5094429, и этим же числом у меня завершается цикл. Я пробовал устанавливать Task.Delay внутри while-цикла, но задержки не происходит.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
03.10.2021, 13:18 20
magrega, ну воткните её до того как собираетесь читать var strR = sr.ReadLine();.
Цитата Сообщение от magrega Посмотреть сообщение
Task.Delay
может await забыли.
0
03.10.2021, 13:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2021, 13:18
Помогаю со студенческими работами здесь

Отправка-запрос файла с сервера
Тут я решил поучить делегаты и понеслось... Короче, решил написать прогу авторизации с логином и...

Отправить запрос с сервера клиенту
Здравствуйте. У меня возникла проблема. Нужно отправить запрос с сервера/сайта в программу и...

Ответ сервера на запрос микроконтроллера.
Всем пр! Сделал девайсину, которая отправляет запрос на вебсервер и должна получить ответ. В...

Ответ сервера UDP на запрос
Добрый день. Перешел с Python на C#, решаю задачу поиска и подключения устройств Arduino (в роли...

Запрос с другого сервера и php
Добрый вечер! Есть такой скрипт: switch ($unbun) { case ('in ban.' == true ): $bans =...

json запрос с сервера на localhost
Здравствуйте. Столкнулся с проблемой отправки json запроса с сайта с программой на кассовый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru