Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2010, 14:01   #1
ggetbraine
 
Регистрация: 20.02.2009
Сообщений: 9
По умолчанию Клиент-сервер C#

Написал клиент и сервер ,которые обмениваются данными по протоколу 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;
    }
ggetbraine вне форума Ответить с цитированием
Старый 02.07.2010, 18:53   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Код:
           data = Encoding.ASCII.GetString(cldata).Trim();
попробуй это заменить на
Код:
           data = Encoding.ASCII.GetString(cldata, 0, i).Trim();
ибо раскодировать нужно не весь буффер, а только [кол-во принятых байтов]

а вывод сообщений можно сделать с помощью событий
или даже по таймеру если с событиями проблемы, но так придется где-то хранить принятые сообщения пока их не заберут

и почитай что-то про правильные имена переменных...

Последний раз редактировалось m0nax; 02.07.2010 в 18:56.
m0nax вне форума Ответить с цитированием
Старый 12.07.2010, 05:04   #3
canki
 
Регистрация: 16.03.2010
Сообщений: 6
По умолчанию

почитай в МСДНе про Stream.AutoFlush это должно помочь

а еще лучше в гугле найди нормальный пример, с использованием потоков
потому что при такой реализации нормальный вывод и взаимодействие с пользователем сделать не выйдет
canki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-Сервер neo-210 Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 23.06.2010 18:40
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57