Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с System.Net.Sockets

32K
12 февраля 2012 года
LawManiak
76 / / 24.10.2011
Помогите переписать стандартный консольный пример сервера на Windows Forms:
Оригинал:
Код:
class Program
    {
        static void Main(string[] args)
        {
            IPAddress localhost = IPAddress.Parse("127.0.0.1");
            TcpListener listener = new System.Net.Sockets.TcpListener(localhost, 1330);
            listener.Start();
           
            while (true)
            {
                Console.WriteLine("Waiting for connection");
                //Объект AcceptTcpClient ждет соединения с клиентом
                TcpClient client = listener.AcceptTcpClient();
                //Запустить новый поток выполнения для обработки этого соединения, чтобы иметь
                //возможность вернуться к ожиданию очередного соединения
                Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
                thread.Start(client);
            }

        }

        static void HandleClientThread(object obj)
        {
            TcpClient client = obj as TcpClient;
           
            bool done = false;
            while (!done)
            {
                string received = ReadMessage(client);
                Console.WriteLine("Received: {0}", received);
                done = received.Equals("bye");
                if (done) SendResponse(client, "BYE");
                else SendResponse(client, "OK");
               
            }
            client.Close();
            Console.WriteLine("Connection closed");
        }

        private static string ReadMessage(TcpClient client)
        {
            byte[] buffer = new byte[256];
            int totalRead = 0;
            do
            {
                int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
                totalRead += read;
            } while (client.GetStream().DataAvailable);
             
            return Encoding.Unicode.GetString(buffer, 0, totalRead);
        }

        private static void SendResponse(TcpClient client, string message)
        {
            byte[] bytes = Encoding.Unicode.GetBytes(message);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }
    }


Вот что получается у меня:
Код:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IPAddress localhost = IPAddress.Parse("127.0.0.1");
            TcpListener listener = new System.Net.Sockets.TcpListener(localhost, 1330);
            listener.Start();
            while (true)
            {
                textBox1.Text += "Waiting for connection";
                TcpClient client = listener.AcceptTcpClient();
                Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
                thread.Start(client);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
         
        }

        private void HandleClientThread(object obj)
        {
            TcpClient client = obj as TcpClient;

            bool done = false;
            while (!done)
            {
                string received = ReadMessage(client);
                textBox1.Text += "Received: {0}" + received;
                done = received.Equals("bye");
                if (done) SendResponse(client, "BYE");
                else SendResponse(client, "OK");
            }
            client.Close();
            textBox1.Text += "Connection closed";
        }

        private static string ReadMessage(TcpClient client)
        {
            byte[] buffer = new byte[256];
            int totalRead = 0;
            do
            {
                int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
                totalRead += read;
            } while (client.GetStream().DataAvailable);

            return Encoding.Unicode.GetString(buffer, 0, totalRead);
        }

        private static void SendResponse(TcpClient client, string message)
        {
            byte[] bytes = Encoding.Unicode.GetBytes(message);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }

    }


Как я понял цикл вешает процесс.
Пробовал писать в Form Load, тогда просто форма не грузится...

Возможно нужно event делать, но я их никогда не писал...

upd.
Прочитал про подобный случай, действительно цикл вешает приложение, его нужно во втором потоке запускать.
Я с таким не сталкивался, надеюсь на вашу помощь...
316
12 февраля 2012 года
Alm3n
889 / / 29.05.2009
 
Код:
while (true)
            {
                Console.WriteLine("Waiting for connection");
                //Объект AcceptTcpClient ждет соединения с клиентом
                TcpClient client = listener.AcceptTcpClient();
                //Запустить новый поток выполнения для обработки этого соединения, чтобы иметь
                //возможность вернуться к ожиданию очередного соединения
                Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
                thread.Start(client);
            }

Так вот у вас и пример создания второго потока есть. Поток по английски thread. Нехорошо внутренности сервера по управлению формой размазывать. Лучше сделать для этого отдельный класс.
32K
12 февраля 2012 года
LawManiak
76 / / 24.10.2011
Спасибо, пока попробую сервер в консоли оставить, а формы только для визуальной работы с базой использовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог