Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
1

Типы данных С# для передачи данных через TCP

11.07.2012, 10:24. Показов 4878. Ответов 13
Метки нет (Все метки)

подскажите пожалуйста какой тип переменной лучше всего использовать в C# для передачи данных через TCP, что бы можно было передать небольшой текст к примеру??? и ограничен ли тип данных string в C# определенным количеством символов как например в делфи 255 символов и не более???
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2012, 10:24
Ответы с готовыми решениями:

Кодировка данных для передачи по TCP/IP
Здравствуйте форумчане!! Тут недавно начал делать сервер, и что делает этот сервер, он принимает...

Клиент-серверное сетевое приложение через среду передачи данных стека TCP/IP
Создать клиент/серверное сетевое приложение для обмена широковещательными текстовыми сообщениями...

Сжатие бинарных данных для быстрой передачи по TCP
Добрый день, Имеются бинарные данные (обычно формата single), которые необходимо посылать от...

Защита передачи данных по tcp/ip
Доброго времени суток. Имеется программа, несколько раз в день посылающая на сервер отчёты по...

13
Эксперт .NET
15322 / 11614 / 3047
Регистрация: 17.09.2011
Сообщений: 19,442
11.07.2012, 10:29 2
Передача по сети осуществляется одним и только одним типом данных: byte.

Цитата Сообщение от Ilnur888 Посмотреть сообщение
ограничен ли тип данных string в C# определенным количеством символов
Ограничен количеством свободной памяти в куче.
1
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
11.07.2012, 10:30  [ТС] 3
ага спасибо. а передать объект XmlDocument к примере можно???
0
Эксперт .NET
15322 / 11614 / 3047
Регистрация: 17.09.2011
Сообщений: 19,442
11.07.2012, 10:31 4
Можно.
Но для начала его надо сериализировать в массив байтов.
0
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
11.07.2012, 10:32  [ТС] 5
Цитата Сообщение от kolorotur Посмотреть сообщение
Можно.
Но для начала его надо сериализировать в массив байтов.
а можно алгоритм, пример кода???
0
Эксперт .NET
15322 / 11614 / 3047
Регистрация: 17.09.2011
Сообщений: 19,442
11.07.2012, 10:44 6
C#
1
2
var buffer = Encoding.UTF8.GetBytes(xmlDocument.OuterXml);
socket.Write(buffer, 0, buffer.Length);
2
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
11.07.2012, 13:14  [ТС] 7
спасибо )

Добавлено через 2 часа 18 минут
ещё один вопрос. нашел алгорит разбиения строки на слова
C#
1
2
3
4
5
6
7
8
9
10
11
12
            string Example = " fdfdf dfdf hghgh dfdfd  rtrtrt rtrt     rtrtrtrtrtrt   rtrtrttr   555kkk5556  555kkk555     rtrtrtrt              rtrtrtrtrt               rtrtrtrtrww        sdflsjfsldk         poipoi ";
            string[] allWords = Example.Split(' ');
            var sameBeginAndEnds = from eachWord in allWords
                                   where eachWord.Length > 0 &&
                                            eachWord[0] == eachWord[eachWord.Length - 1]
                                   select eachWord;
 
            foreach (var sameBeginAndEnd in sameBeginAndEnds)
            {
                Console.WriteLine(sameBeginAndEnd);
            }
            Console.ReadLine();
ругается на allWords в выражении
C#
1
from eachWord in allWords
в чем может быть проблема???
0
Эксперт .NET
15322 / 11614 / 3047
Регистрация: 17.09.2011
Сообщений: 19,442
11.07.2012, 13:19 8
Самое главноев любой ошибке - это текст этой ошибки.
Вроде ж очевидно.
0
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
11.07.2012, 13:23  [ТС] 9
Ошибка 12 Не удается найти реализацию шаблона запроса для типа источника "string[]". "Where" не найден. Возможно, не хватает ссылки на "System.Core.dll" или директивы using для "System.Linq".

не пойму в чем ошибка, System.Linq у меня нету (((
0
Эксперт .NET
15322 / 11614 / 3047
Регистрация: 17.09.2011
Сообщений: 19,442
11.07.2012, 14:13 10
Цитата Сообщение от Ilnur888 Посмотреть сообщение
не хватает ссылки на "System.Core.dll" или директивы using для "System.Linq
Цитата Сообщение от Ilnur888 Посмотреть сообщение
System.Linq у меня нету
Целевая версия фреймворка в свойствах проекта?
0
2 / 2 / 0
Регистрация: 18.01.2012
Сообщений: 163
11.07.2012, 15:05  [ТС] 11
как получить доступ к ниже перечисленным методам и свойствам???

Работа со строками Strings в C#
Язык программирования C#
Клаcc Strings включает множество методов сравнения, поиска и изменения строковых значений. Здесь я приведу список часто необходимых (лично мне) возможностей этого класса:

Empty — свойство определяющее пустая ли строка;
Compare() — сравнивает две строки;
CompareOrdinal() — позволяет сравнивать строки в независимости от региональных настроек;
Concat() — объединяет две и более строки в новую строку;
Copy() — Копирует исходную строку;
Equals() — проверяет, содержат ли две строки одинаковые значения;
Format() — форматирует строку, используя строго заданный формат;
Intern() — возвращает ссылку на существующий экземпляр строки;
Join() — добавляет новую строку в заданное место уже существующей строки;
Chars — индексатор символов строки;
Length — количество символов в строке;
Clone() — возвращает ссылку на существующую строку;
CompareTo() — сравнивает одну строку с другой;
CopyTo() — копирует заданное число символов строки в массив Unicode символов;
EndsWith() — проверяет, заканчивается ли строка определённой последовательностью символов;
Equals() — определяет, имеют ли две строки одинаковые значения;
Insert() — вставляет новую строку в уже существующую;
LastIndexOf() — возвращает индекс последнего вхождения элемента в строку;
PadLeft() — выравнивает строку по правому краю, пропуская все проблеы или другие специально заданные символы;
PadRight() — выравнивает строку по левому краю, пропуская все проблеы или другие специально заданные символы;
Remove() — удаляет заданное число символов из строки;
Split() — возвращает подстроку, отделённую от основного массива определённым символом;
StartsWith() — определяет, начинается ли строка с определённой последовательности символов;
Substring() — возвращает подстроку из общего массива символов;
ToCharArray() — копирует символы из строки в массив символов;
ToLower() — преобразует символы в строке к нижнему регистру;
ToUpper() — преобразует символы в строке к верхнему регистру;
Trim() — удаляет все вхождения определённых символов в начале и в конце строки;
TrimEnd() — удаляет все вхождения определённых символов в конце строки;
TrimStart() — удаляет все вхождения определённых символов в начале строки.
 Комментарий модератора 
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
0
4 / 4 / 4
Регистрация: 26.04.2013
Сообщений: 67
16.01.2015, 16:08 12
Ребят помогите, передаю XML, но файл приходит не полностью, в какую сторону капать? Возможно размер пакете не позволяет?:
Кликните здесь для просмотра всего текста

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
        static void SendMessageFromSocket(string IPAddress, int Port, byte[] args)
        {
            // Соединяемся с удаленным устройством
            // Устанавливаем удаленную точку для сокета
            IPHostEntry ipHost = Dns.GetHostEntry(IPAddress);
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, Port);
 
            using (Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
            {
                // Соединяем сокет с удаленной точкой
                sender.Connect(ipEndPoint);
 
                // Буфер для входящих данных
                byte[] bytes = new byte[1024];
 
                // Отправляем данные через сокет
                int bytesSent = sender.Send(args);
 
                // Получаем ответ от сервера
                int bytesRec = sender.Receive(bytes);
 
                MessageBox.Show(Encoding.UTF8.GetString(bytes, 0, bytesRec));
 
                // Освобождаем сокет
                //sender.Shutdown(SocketShutdown.Both);
            }
        }


Сериализация:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
        private static Byte[] ObjectToByteArray<T>(T obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xmlS = new XmlSerializer(typeof(T));
                xmlS.Serialize(ms, obj);
 
                return ms.ToArray();
            }
        }


Прием:

Кликните здесь для просмотра всего текста

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
 private void acceptCallback(IAsyncResult ar)
        {
            Socket listener = (Socket)ar.AsyncState;
            try
            {
                using (Socket handler = listener.EndAccept(ar))
                {
                    string data = null;
 
                    // Мы дождались клиента, пытающегося с нами соединиться
                    
                    byte[] bytes = new byte[1048576];  //Специально сделал буфер побольше, думал в нем проблемма
                    int bytesRec = handler.Receive(bytes);
 
                    data += Encoding.UTF8.GetString(bytes);
                    this.Invoke(ErrorMessage, data);
 
                    //Отправляем ответ клиенту\
                    string reply = "Соеденение успешно получено";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);
 
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
 
                listener.BeginAccept(new AsyncCallback(this.acceptCallback), listener);
            }
            catch { }
        }


Дисериализация, здесь ошибка, не удается прочитать string как XML, так как половины файла нет:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void GetDataFromSoket(string data) 
        {
            XDocument doc = XDocument.Parse(data); //Тут ошибка, пол файла нет...
            XElement el = doc.Element("Monitor");
            MonitorNameTBox.Text = el.Attribute("Name").Value;
            MonitorSizeTBox.Text = el.Attribute("Width").Value + "x" + el.Attribute("Height").Value;
            ProccessNameTBox.Text = el.Attribute("ProccessName").Value;
            MovePathTBox.Text = el.Attribute("MovePath").Value;
            PricePathTBox.Text = el.Attribute("PricePath").Value;
 
            PriceLBox.Items.Clear();
 
            foreach(XElement prod in el.Elements())
            {
                ListViewItem item = new ListViewItem(new[] { prod.Attribute("Name").Value, prod.Attribute("Price").Value, prod.Attribute("dateFrom").Value, prod.Attribute("dateTo").Value });
 
                PriceLBox.Items.Add(item);
            }
        }
0
46 / 38 / 15
Регистрация: 28.09.2012
Сообщений: 818
16.01.2015, 16:26 13
C#
1
byte[] bytes = new byte[1024];
вы же в самом начале ограничели себя заместь 1024 там надо размер точно непомню как писать строки той что передаете

Добавлено через 1 минуту
в байтах
0
4 / 4 / 4
Регистрация: 26.04.2013
Сообщений: 67
16.01.2015, 16:29 14
Обратите внимание, bytes передается в sender.Receive(bytes); - это буфер ответа
C#
1
2
3
4
5
6
7
8
                // Буфер для входящих данных
                byte[] bytes = new byte[1024];
 
                // Отправляем данные через сокет
                int bytesSent = sender.Send(args);
 
                // Получаем ответ от сервера
                int bytesRec = sender.Receive(bytes);
Буфер для приема XML вот: byte[] bytes = new byte[1048576];
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using (Socket handler = listener.EndAccept(ar))
                {
                    string data = null;
 
                    // Мы дождались клиента, пытающегося с нами соединиться
                    
                    byte[] bytes = new byte[1048576];  //Специально сделал буфер побольше, думал в нем проблемма
                    int bytesRec = handler.Receive(bytes);
 
                    data += Encoding.UTF8.GetString(bytes);
                    this.Invoke(ErrorMessage, data);
 
                    //Отправляем ответ клиенту\
                    string reply = "Соеденение успешно получено";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);
 
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2015, 16:29

Пример передачи данных с использованием стека протоколов HTTP/TCP/IP/Wi-Fi
Здравствуйте, изучаю компьютерные сети, на данный момент стек протоколов TCP/IP. Перед этим искал...

Нету названия кнопки для передачи post данных через curl
Когда передаю данные на свой сайт через curl логип пароль и кнопку вход все нормально, но нужно...

Менять скорость передачи данных TCP/IP из скрипта? (VBS,WSH,BAT, PowerShall)
Hi guys and ladies ) Есть необходимость в написании следующего скрипта, ПО, батника, вообще чего...

Разработать компьютерную программу для передачи данных от компьютера на Микроконтроллер через COM-порты
Друзья подскажите, задали вот такую задачу, нужна программка, может быть есть у кого готовая?Буду...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.