Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103

Не читает данные из потока. TCP

16.03.2012, 14:41. Показов 2559. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть сервер который отправляет команду
C#
1
-getio|C:\
клиенту.
В клиенте условие:
C#
1
2
3
4
5
if (Command.ToLower().StartsWith("-getio"))
{
CommandLine = Command.Split('|');
String[] DirRead = System.IO.Directory.GetDirectories(CommandLine[1]);
}
Тоесть, если переменная Command начинается с -getio то заносим весь текст после знака | в массив CommandLine. Получается что в CommandLine[1] у нас лежит путь, мы вытаскиваем все пути из этого пути в массив DirRead. После этого соединяемся с сервером:
C#
1
Client = new System.Net.Sockets.TcpClient("10.10.200.48", 8547);
После:
C#
1
2
3
4
5
6
System.Net.Sockets.NetworkStream Stream = Client.GetStream();
foreach (string Dir in DirRead) 
{
    Console.WriteLine(DirRead[2]);
    Stream.Write(Encoding.GetBytes("-setio|" + Dir), 0, Dir.Length);
}
Тоесть серверу мы отправили такую строку:
C#
1
-setio|C:\Program Files
Теперь сервер должен считать данные из потока:
C#
1
2
3
4
byte[] Data = new Byte[1024];
Int32 bytes = IO.Read(Data, 0, Data.Length);
string ResponseData = Encoding.GetString(Data, 0, bytes);
Reading_instruction(ResponseData);
В метод Reading_instruction должна передатся трока вида:
C#
1
-setio|C:\Program Files
А дальше это строка ловится условием:
C#
1
2
3
4
5
if(Commands.ToLower().StartsWith("-setio"))
{
    CommandLine = Commands.Split('|');
    Console.WriteLine(CommandLine[1]);
}
Сервер неполучает строку, и естественно в метод Reading_instruction ничего не проходит. Почему?

Добавлено через 8 минут
Эксепшены не вылетают, что настораживает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2012, 14:41
Ответы с готовыми решениями:

2 потока, один пишет в консоль другой читает с него. Не прокатило
есть консольная программа для работы с пользователем можно ли как-нибудь сделать так чтобы другая программа писала в консоль что-то что...

Общий размер TCP потока
Как известно TCP передает данные ввиде сегментов(порциями), а как сервер узнает общий размер потока данных(То есть размер общего количества...

Разделение TCP потока на отдельные пакеты
получаю данные так: Socket lsSock; byte data = new byte; lsSock.Recieve(data); данные - это пакеты где первые 2 байта - размер...

9
 Аватар для Mega-xaxax
38 / 38 / 1
Регистрация: 11.03.2012
Сообщений: 95
16.03.2012, 14:49
В первую очередь, вы должны знать, в какой кодировке передаете данные.
Далее замените строки с
C#
1
Encoding.GetString()
на
C#
1
Encoding.ASCII.GetString()
или
C#
1
Encoding.UTF8.GetString()
0
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
16.03.2012, 15:12  [ТС]
Код сервера:
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
class Program
{
    public static void Main()
    {
        try 
        {
            System.Net.IPAddress IP = System.Net.IPAddress.Parse("10.10.200.48");
            System.Net.Sockets.TcpListener Server = new System.Net.Sockets.TcpListener(IP, 8547);
            Server.Start();
            while (true)
                {
                System.Net.Sockets.TcpClient Client = Server.AcceptTcpClient();
                    System.Net.Sockets.NetworkStream IO = Client.GetStream();
                    Console.WriteLine("Клиент готов! ");
                    string Command = Console.ReadLine();
                    IO.Write(System.Text.UnicodeEncoding.UTF8.GetBytes(Command), 0, System.Text.UnicodeEncoding.UTF8.GetBytes(Command).Length);
                    
                    byte[] Data = new Byte[1024];
                    Int32 bytes = IO.Read(Data, 0, Data.Length);
                    string ResponseData = System.Text.UnicodeEncoding.UTF8.GetString(Data, 0, bytes);
                    Reading_instruction(ResponseData);
                }
            } 
            catch (Exception ex) 
            {
                Console.WriteLine("\nПроизошла ошибка {0}", ex.Message);
                Main();
            }
        }
        public static void Reading_instruction(string Commands)
        {
            string[] CommandLine;
            if(Commands.ToLower().StartsWith("-setio"))
            {
                CommandLine = Commands.Split('|');
                Console.WriteLine(CommandLine[1]);
            }
        }
Код клиента:
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
class Program
    {       
        public static System.Net.Sockets.TcpClient Client;
        public static void Main()
        {
            try
            {
                while (true) 
                {   
                    Client = new System.Net.Sockets.TcpClient("10.10.200.48", 8547);
                    byte[] Data = new Byte[1024];
                    System.Net.Sockets.NetworkStream Stream = Client.GetStream();
                
                    Int32 bytes = Stream.Read(Data, 0, Data.Length);
                    string ResponseData = System.Text.UnicodeEncoding.UTF8.GetString(Data, 0, bytes);
                    Reading_instruction(ResponseData);  
                }
            } 
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка: {0}", ex.Message);
                Main();
            }
        }
        
        static void Reading_instruction(string Command)
        {
            string[] CommandLine = null;
            try
            {
if (Command.ToLower().StartsWith("-getio"))
                {
                    CommandLine = Command.Split('|');
                    string[] DirRead = System.IO.Directory.GetDirectories(CommandLine[1]);
                    Client = new System.Net.Sockets.TcpClient("10.10.200.48", 8547);
                    System.Net.Sockets.NetworkStream Stream = Client.GetStream();
                    foreach (string Dir in DirRead) 
                    {
                        Console.WriteLine(DirRead[2]);
                        Stream.Write(System.Text.UnicodeEncoding.UTF8.GetBytes("-setio|" + Dir), 0, Dir.Length);
                    }
                }
Сделал как вы мне посоветывали, еффект тот-же.
0
 Аватар для Mega-xaxax
38 / 38 / 1
Регистрация: 11.03.2012
Сообщений: 95
16.03.2012, 17:01
Попробуйте через telnet подключиться к вашему TCP-серверу.

Делается этот так.
Если windows, то:
Установка и удаление программ -> дополнительные функции -> устанавливаем telnet
Если POSIX, то telnet доступен из коробки

Формат команды:
telnet host port
Пример:
telnet 10.10.200.48 8547

После подключения через telnet можно будет вводить команды, которые будут посылаться вашему серверу (аналог вашего клиента)

Туда вписываем вашу команду. Если работает, значит проблема в вашем самописном клиенте. Если не работает, значит проблема в сервере.

Если вы уверены, что код клиента и сервера в порядке, то вероятно вы что-то напутали с IP-адресами. Если не правильно указан IP-сервера (в клиентском приложении), то через telnet подключиться не удастся.

Сегодня ночью сам парился с TCP-сервером, он не хотел принимать запросы с Mac OS X-приложения. telnet помог понять, что проблема не в сервере. Далее я стал ковырять клиента. Разобрался в итоге. Вечером могу скинуть свой код сервера (упер с MSDN), если надо будет.

Добавлено через 12 минут
Код:
C#
1
string ResponseData = System.Text.UnicodeEncoding.UTF8.GetString(Data, 0, bytes);
В вашем коде ошибка - первый параметр - это массив со значениями byte, второй параметр смещение - у вас правильно стоит 0 (считывать с начала массива), а вот третий параметр это количество считываемых значений (должно быть Data.Lenght).
Я бы переписал как
C#
1
string ResponseData = Encoding.UTF8.GetString(Data,0,Data.Lenght);
1
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
16.03.2012, 17:21  [ТС]
Цитата Сообщение от Mega-xaxax Посмотреть сообщение
Попробуйте через telnet подключиться к вашему TCP-серверу.
Попробывал, сервер отлично функционирует, проблемма в клиенте однозначно, на стороне клиента он показывает все директории, а серверу не отправляет, странно.
0
 Аватар для Mega-xaxax
38 / 38 / 1
Регистрация: 11.03.2012
Сообщений: 95
16.03.2012, 17:30
Может проблема в это строке?
C#
1
Stream.Write(System.Text.UnicodeEncoding.UTF8.GetBytes("-setio|" + Dir), 0, Dir.Length);
Здесь вы к "-setio|" плюсуете Dir, но тогда длина получается равной
C#
1
"-setio|".Length+Dir.Length
1
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
17.03.2012, 16:30  [ТС]
Провел анализ, выяснилось что:

1. Сервер все отправляет правильно.
2. Клиент все принимает правильно.
3. Наедена некая проблеммка:

Включаю сервер, включаю клиент, клиент подключается к серверу и ждет пока пойдет передача данных, сервер отправляет команду
C#
1
-getdir|C:\
, клиент интерпритирует ее, путь заносит в переменную, и считывает все дириктории из пути в переменной. Далее в цикле foreach сервер должен отправлять данные вида:
C#
1
-setdir|C:\Program Files
цикл в условии выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
if (Command.ToLower().StartsWith("-getdir"))
{
    CommandLine = Command.Split('|');
    string[] DirRead = System.IO.Directory.GetDirectories(CommandLine[1]);
    Client = new System.Net.Sockets.TcpClient("10.10.200.48", 8547);
    System.Net.Sockets.NetworkStream Stream = Client.GetStream();
    foreach (string Dir in DirRead) 
    {
        Console.WriteLine("-setdir|" + Dir);
        Stream.Write(System.Text.UnicodeEncoding.UTF8.GetBytes("-setdir|" + Dir), 0, Dir.Length);
    }
}
На консоль клиент выводит все правильно. А вот отправляет он почему-то не с первого раза. Тоесть ввожу в сервере -getdir|C:\ клиент выполняет Console.WriteLine("-setdir|" + Dir);, ввож ту же команду второй раз сервер получает такое сообщение?
C#
1
-setdir|C:\$Rec-setdir-setdir|C:\Documents and -setdir|C:\D-setdir
и тд. Почему он отправляет именно так, я незнаю. Точно знаю что проблемма в клиентской строчке
C#
1
Stream.Write(System.Text.UnicodeEncoding.UTF8.GetBytes("-setdir|" + Dir), 0, Dir.Length);
но немогу понять где именно.

Добавлено через 10 часов 5 минут
Все, проблемма решена, но появилась новая, но это уже другой пост.

Mega-xaxax отдельное спасибо.
0
 Аватар для Mega-xaxax
38 / 38 / 1
Регистрация: 11.03.2012
Сообщений: 95
17.03.2012, 17:08
Да не за что
А в чем дело было?
0
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
17.03.2012, 17:23  [ТС]
Цитата Сообщение от Mega-xaxax Посмотреть сообщение
А в чем дело было?
Была клиентская строчка
C#
1
Stream.Write(System.Text.UnicodeEncoding.UTF8.GetBytes("-setdir|" + Dir), 0, Dir.Length);
где нужно было
C#
1
Dir.Length
заменить на
C#
1
System.Text.UnicodeEncoding.UTF8.GetBytes("-setdir|" + Dir).Length)
Да и пакеты отправлялись клиентом по 8 байт, а на сервере разбивались на 1024 байта, интересно как-же эксепшены не вылеталиО_о

Теперь мне вон какая проблемма спать мешает: Клиент-сервер, артефакты с DataAvailable
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
04.03.2019, 13:00
Товарищи, может вы сможете подсказать почему у меня чтение потока срабатывает два раза, он почему - то видит что есть непоочитанные данные и печатает два раза
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
socketStream = new NetworkStream(connection); // поток используемый для отправки данных
                    writer = new BinaryWriter(socketStream);
                    reader = new BinaryReader(socketStream);
                    args[0] = txtboxStatus;
                    args[1] = "Have connection" + "\r\n";
                    args[2] = true;
                    txtboxStatus.BeginInvoke(delegateAddTextBox, args);
                    writer.Write("Test 1 - Server -> Client ");
                    string theReply = "";
                    Byte[] bytes = new Byte[1024];
                    String receiveDataString = null;
                    int i;
                    do//Шаг 4 считывание строки данных от клиента
                    {
                        try
                        {
                            i = reader.Read(bytes, 0, bytes.Length);
                            if (i != 0)
                            {
                                receiveDataString = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                                args[0] = txtboxReceive;
                                args[1] = "\r\n" + i.ToString() ;
                                args[2] = true;
                                txtboxReceive.BeginInvoke(delegateAddTextBox, args);                                
                            }
                        }
                        catch (Exception exc) //обработка исключения при считывания данных
                        {
                            MessageBox.Show(exc.ToString());
                            break;
                        }
                    }
                    while ((theReply != "Client -> Terminate us") && (connection.Connected) && (active));
Пробовал read string, там такого нет, но есть исключение потому что при закрытии программы я как будто пытаюсь прочитать его конец, а просмотреть свойство position не могу. Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2019, 13:00
Помогаю со студенческими работами здесь

Как создать два потока в TCP
Привет всем, с наступающим всех)). Как создать два потока в TCP??? тоесть один поток отправляет текст в Edit1 второй в Edit2, писать...

Не читает вводимые данные
Нужно было сделать что-то подобное контейнеру... вот, что у меня есть: program.cs using System; using System.Collections.Generic; ...

QSerialPort не читает данные
День добрый, программа открывает порт и пишет туда строго определенные байты, 3E 56 00 56 00 последовательность правильный, в терминалах...

Картридер не читает данные
Есть флеш-карта для фотоапарата: transcend 16Gb(SDHC). И есть картридер Lapara LA-UHC308. При вставке картридера данные из флешки не...

читает из файла данные
привет всем! читала здесь, искала в гугле, но ничего толком не нашла, подскажите пожалуйста, нужна программа, которая читает из файла...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru