Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > TcpClient


Автор: Aline 2.5.2007, 13:10
Всем привет!
Дело в том, что мне надо написать клиента, работающего по протоколу 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)  ?
Может у кого то есть уже готовая программка небольшая, которую можно посмотреть в качестве примера?
 

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

Автор: Aline 4.5.2007, 10:09
Сколько не пробую разных примеров и из ссылки и из 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 подключить, чтоб он прослушывал порт?

Автор: tol05 4.5.2007, 10:22
Извини, а почему у тебя запись и чтение не в цикле? После 
Код

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 будет держать поток пока не передаст. Но все равно не факт, что условия на прием успеют выполнится. Так что все остальное - в силе.

Автор: Aline 4.5.2007, 12:18
tol05, потому что раньше я работала с Билдером, а с этим только-только начала знакомиться. И программу мне надо переделать на VS, C#.
Я понимаю, что где-то неправильно, но где именно - нет.
А вообще, честно говоря, не совсем понимаю как это будет всё работать.

Автор: mr.DUDA 5.5.2007, 18:40
Aline, ну tol05 в принципе написал как оно должно работать.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)