none
Клиент-сервер RRS feed

  • Вопрос

  • Здравствуйте!

    Написал клиент и сервер ,которые обмениваются данными по протоколу TCP/IP . При использовании ,возникла следующая ошибка :  когда клиент отправляет серверу ,более чем 1 раз ,сообщение ,то сервер вывод это сообщение+кусок от старого. Как мне исправить данную ошибку?

    Подскажите как можно на привязать на сервер RichTextBox ,что бы в нем отображались сообщения ,полученные от клиента?

     

    Код класса сервера:

     

    class ServerClass
      {
        
          private int LocalPort;
          private Thread ServThread; // экземпляр потока
          TcpListener Listener; // листенер
          private string message_from_client;
          public bool stop;
    
          public void Create(int port)
          {
            LocalPort = port;
            ServThread = new Thread(new ThreadStart(ServStart));
            ServThread.Start(); // запустили поток. Стартовая функция – 
            // ServStart, как видно выше
          }
    
          public void Close() // Закрыть серв?
          {
            Listener.Stop();
            ServThread.Abort();
            return;
          }
    
          private void ServStart()
          {
            Socket ClientSock; // сокет для обмена данными.
            string data;
            byte[] cldata = new byte[1024]; // буфер данных
            Listener = new TcpListener(LocalPort);
            Listener.Start(); // начали слушать
            //Console.WriteLine("Waiting connections [" + Convert.ToString(LocalPort) + "]...");
            try
            {
              ClientSock = Listener.AcceptSocket(); // пробуем принять 
              // клиента
            }
            catch
            {
              ServThread.Abort(); // нет – жаль(
              return;
            }
            int i = 0;
    
            if (ClientSock.Connected)
            {
              while (true)
              {
                try
                {
                  i = ClientSock.Receive(cldata); // попытка чтения 
                  // данных
                }
                catch { }
                try
                {
                  if (i > 0)
                  {
    
                    data = Encoding.ASCII.GetString(cldata).Trim();
                    //Console.WriteLine("<" + data);
                    message_from_client = data;
                    if (stop) // если CLOSE – 
                    // вырубимся
                    {
                      //ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
                      //ClientSock.Close();
                      Listener.Stop();
                      //Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
                      ServThread.Abort();
                      return;
                    }
                  }
                }
                catch
                {
                  ClientSock.Close(); // ну эт если какая хрень..
                  Listener.Stop();
                  //Console.WriteLine("Server closing. Reason: client offline. Type EXIT to quit the application.");
                  ServThread.Abort();
                }
              }
            }
          }
          public string getRcvdMessage()
          {
            return message_from_client;
          }
        }

    Использование этого класса:

     public partial class ClientForm : Form
      {
        //private string tcp_adr;
        private int port_number;
        ServerClass Serv = new ServerClass();
        //bool stop;
    
        public ClientForm()
        {
          InitializeComponent();
        }
        private void StartServer_Click(object sender, EventArgs e)
        {
          port_number = System.Convert.ToInt32(port_value.Text);
          
          Serv.Create(port_number);
          rcvdText.Text = Serv.getRcvdMessage();
        }
        private void StopServer_Click(object sender, EventArgs e)
        {
          // Serv.stop = !Serv.stop;
        }

    Ссылка на исходный проект (писалось все это дело под MS Visual Studio 2010):

     http://ifolder.ru/18394354

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:21 MSDN Forums Consolidation (От:Visual C#)

Ответы

  • Скорей всего потому что вы не очищаете массив cldata. После первого прочтения в нем остаются данные от старого сообщения и вы перезаписываете его новыми данными, но возможно не полностью, поэтому после

    data = Encoding.ASCII.GetString(cldata).Trim();
    попробуйте выделять новый массив

    cldata = new byte[1024]

    • Помечено в качестве ответа I.Vorontsov 5 июля 2010 г. 5:42
    2 июля 2010 г. 15:43

Все ответы

  • Скорей всего потому что вы не очищаете массив cldata. После первого прочтения в нем остаются данные от старого сообщения и вы перезаписываете его новыми данными, но возможно не полностью, поэтому после

    data = Encoding.ASCII.GetString(cldata).Trim();
    попробуйте выделять новый массив

    cldata = new byte[1024]

    • Помечено в качестве ответа I.Vorontsov 5 июля 2010 г. 5:42
    2 июля 2010 г. 15:43

  • data = Encoding.ASCII.GetString(cldata, 0, i).Trim();

    вот эта строчка мне помогла =).

     

    возник еще  одна задача 

    а как можно с помощью событий реализовать следующее : "если от клиента появилось сообщение ,то в RichTextBox выводим это сообщение?"

    2 июля 2010 г. 19:47
  • создайте отдельный поток и слушайте клиента, как только появится так сразу и запишите что-нибудь в текстбокс:)

    2 июля 2010 г. 20:09