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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент - сервер ,ошибка 
:(
    Опции темы
terance
Дата 1.7.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Возникла задача написать простое клиент-серверное приложение ,которое использует сокеты для обмена данными по протоколу TCP/IP. Клиент просто шлет сообщение ,введенное пользователем в send_message(TextBox) . Сервер принимает это сообщение и отображает его в rcvdText(RichTextBox).

Класс клиента:
Код

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ClientSevertApplication
{
    class ClientClass
        {
        private TcpClient tcp_client;
        //private string message_to_send = "";
        byte[] send_bytes;

        public ClientClass(string tcp_adress,int port)
        {
            tcp_client = new TcpClient();
            tcp_client.Connect(tcp_adress, port);
        }
        public void SendData(string message_to_send)
        {
            NetworkStream stream = tcp_client.GetStream();
            send_bytes=Encoding.ASCII.GetBytes(message_to_send);
            stream.Write(send_bytes, 0, send_bytes.Length);
        }
    }
}

Привязка интерфейса к этому классу:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClientSevertApplication
{
    public partial class ClientForm : Form
    {
        ClientClass myClient;
        public ClientForm()
        {
            InitializeComponent();
        }

        private void StartClient_Click(object sender, EventArgs e)
        {
            string ip_adr = port_value.Text;
            int port = System.Convert.ToInt32(adr_value.Text);

            myClient = new ClientClass(ip_adr,port);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            myClient.SendData(send_message.Text);
        }
    }
}

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

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;


namespace ClientSevertApplication
{
    class ServerClass
    {
        private int port = 0;
        private string rcv_message = "";
        private string err_msg="";
        private byte[] bytes_read=new byte[100];
        private TcpListener listener;
        private TcpClient client;
        private NetworkStream stream;

        public ServerClass(int port_number)
        {
            try
            {
                port = port_number;
                listener = new TcpListener(port);
                listener.Start();
                client = listener.AcceptTcpClient();
                stream = client.GetStream();//принимаем данные в потоке от клиента
                stream.Read(bytes_read, 0, 100);
                rcv_message = Encoding.ASCII.GetString(bytes_read);
            }
            catch(Exception e)
            {
                if (e.ToString() != null)
                {
                    err_msg=e.ToString();
                }
            }
        }
        public string getMessage()
        {
            return rcv_message;
        }
        public string getErrors()
        {
            return err_msg;
        }
    }
}

Привязка интерфейса к этому классу
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClientSevertApplication
{
    public partial class ClientForm : Form
    {
        private string tcp_adr;
        private int port_number;
        ServerClass myServer;
        bool stop;

        public ClientForm()
        {
            InitializeComponent();
        }

        private void StartServer_Click(object sender, EventArgs e)
        {
            port_number = System.Convert.ToInt32(port_value.Text);
            myServer = new ServerClass(port_number);
            while (!stop)
            {
                rcvdText.Text += myServer.getMessage();
            }
        }

        private void StopServer_Click(object sender, EventArgs e)
        {
            stop = !stop;
        }
    }
}


Возникла следующая проблема:

при запуске сервера ,форма начинает "висеть" ,при этом ее можно завершить только через диспетчера задач. Подскажите в чем проблема?

ПС в аттаче лежит архив проекта . Среда разработки MS Visual Stduio 2010

Это сообщение отредактировал(а) terance - 1.7.2010, 16:07

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  ClientServerApplication.rar 82,51 Kb
PM MAIL   Вверх
Mephisto
Дата 4.7.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



Ну самый простой вариант это расставить точки останова и посмотреть куда программа не доходит smile
А вообще на стороне сервера нужно создавать отдельный пул потоков чтобы каждый поток обрабатывал одно соединение, либо боле усложненная задача с переключением через селектор сокетов .net. 
А вообще бы я рекомендовал покопать в сторону WCF, на первый взгляд кажется сложнее, но на самом деле это не так. Если разберешься, жить станет намного проще с клиент-серверными приложениями.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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