Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TcpClient, помогите разобраться 
:(
    Опции темы
Aline
Дата 2.5.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Всем привет!
Дело в том, что мне надо написать клиента, работающего по протоколу TCP. Вернее переписать программу сделанную на C++ Builder. В Билдере  был компонент  ClientSocket, здесь насколько я поняла использутся TcpClient.  Как подключиться я поняла как, но вот не поняла как получать данные. В Билдере было событие OnRead, т.е. когда приходили пакеты от сервера срабатывало это событие и дальше можно было получить пришедшие данные и  работать с ними. В VS я этого не нашла. Конечно есть примеры в MSDN, но мне почему достаточно сложно в этом разобраться и потом, как читать данные, нужно заводить таймер? И в таймере вызывать read?

Код


NetworkStream stream = client.GetStream();
 
// Buffer to store the response bytes.
data = new Byte[256];


// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);



Что это за процедура: static void Connect(String server, String message)  ?
Может у кого то есть уже готовая программка небольшая, которую можно посмотреть в качестве примера?
 
PM MAIL   Вверх
QryStaL
Дата 2.5.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 3
Всего: 32



Тебе нужно использовать классы TcpListener и TcpClient.
Пример здесь: http://www.rsdn.ru/article/dotnet/dotnetchat.xml#EQEAC


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Aline
Дата 4.5.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Сколько не пробую разных примеров и из ссылки и из MSDN не получается у меня прочесть то, что приходит с сервера. На сервер данные отправляются, а вот считать в клиенте что сервер ответил не могу. Гляньте код:

Код

  public MainForm()
        {
            InitializeComponent();
            Signals = new TSignal [5,16];
            for (int i = 0; i < 5; ++i) {
              for (int j = 0; j < 16; ++j) {
                Signals[i,j].SignTable = new TSignalTable[64];
              }
            }
            try
            {
                client.Connect("Aline_113_160", port);
                toolStripStatusLabel1.Text = "Connect to: Aline_113_160";
                NetworkStream networkStream = client.GetStream();

                if (networkStream.CanWrite)
                {
                    // Does a simple write.
                    byte[] sendBytes = {0x93, 0x03, 0x03,0x12,0x23,0x45,0x11,0x15,0x34,0x17,0x28,0x18,0x22,0x12 };
                    networkStream.Write(sendBytes, 0, sendBytes.Length);                  
                }
                if (networkStream.CanRead && (client.Available>0)) {
                    // Reads the NetworkStream into a byte buffer.
                     byte[] bytes = new byte[client.ReceiveBufferSize];
                     networkStream.Read(bytes, 0, (int)client.ReceiveBufferSize);
                }
                else if (!networkStream.CanRead)
                {
                    //Console.WriteLine("You can not write data to this stream");
                    client.Close();
                }
                else if (!networkStream.CanWrite)
                {
                    //Console.WriteLine("You can not read data from this stream");
                    client.Close();
                }

            }
            catch (Exception e)
            {                
                MessageBox.Show(e.ToString(), "Connection error",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                toolStripStatusLabel1.Text ="No connection";
            }
            
        }


или может надо ещё tcpListener подключить, чтоб он прослушывал порт?
PM MAIL   Вверх
tol05
Дата 4.5.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Извини, а почему у тебя запись и чтение не в цикле? После 
Код

networkStream.Write(sendBytes, 0, sendBytes.Length);


сразу идет
Код

if (networkStream.CanRead && (client.Available>0)) {
                    // Reads the NetworkStream into a byte buffer.
                     byte[] bytes = new byte[client.ReceiveBufferSize];
                     networkStream.Read(bytes, 0, (int)client.ReceiveBufferSize);
                }


Как может networkStream стать CanRead, когда он даже еще не начал передавать?
И сразу вываливаешься из Main, astalavista, типа smile
Так нельзя
Нужно как минимум сделать в Main 
Код

while("условие")
{
весь код
}


тогда и будет клиент крутиться то на прием, то на передачу.
А еще лучше исп. не networkStream.Read, networkStream.Write, а асинхронные их варианты, да с callback-ами.
Или отдельные потоки на запись и чтение.
Но главное, не вываливаться из Main.

P.S. Немного погорячился, Read будет держать поток пока не передаст. Но все равно не факт, что условия на прием успеют выполнится. Так что все остальное - в силе.

Это сообщение отредактировал(а) tol05 - 4.5.2007, 10:35


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Aline
Дата 4.5.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



tol05, потому что раньше я работала с Билдером, а с этим только-только начала знакомиться. И программу мне надо переделать на VS, C#.
Я понимаю, что где-то неправильно, но где именно - нет.
А вообще, честно говоря, не совсем понимаю как это будет всё работать.
PM MAIL   Вверх
mr.DUDA
Дата 5.5.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Aline, ну tol05 в принципе написал как оно должно работать.  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.