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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите в создании многопользовательского чата! Очень нужно!!! 
:(
    Опции темы
alir
  Дата 26.3.2005, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Итак, я написал однопользовательский чат, т.е. общатся могут только клиент и сервер. Все это организовано следущим образом:

На сервере запускается слушатель - форма с кнопкой, запускающей чат (а после форма скрывается). Кнопка определяется так:

Код

private void button1_Click(object sender, System.EventArgs e)
{
button1.Enabled = false;
            this.Hide();
            //вызываем окно ответа (form2), если есть коннет по hsotPort
            Form2 blockedForm = new Form2(hostPort,this);
            blockedForm.ShowDialog();
            if (blockedForm.formClosed == true)
            {
                this.Close();
            }
        }


Т.е. слушатель ждет пока приконнектится клиент.
Кнопка соединится по IP:
Код

private void buttonConnect_Click(object sender, System.EventArgs e)
        {
            textBoxIPAddress.Enabled = false;
            IPAddress address = IPAddress.Parse(ipAddress);
                    
            tcp = new TcpClient((new IPEndPoint(Dns.Resolve(Dns.GetHostName()).AddressList[0],4002)));
            LingerOption lingerOption = new LingerOption(false, 1);
            tcp.LingerState = lingerOption;
            tcp.Connect(new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0],4001));
            buttonSend.Enabled = true;
            ((Button)sender).Enabled = false;
            receiveThread = new Thread(new ThreadStart(ThreadProcReceive));
            receiveThread.Name = "Клиентовский поток";
            receiveThread.Start();
        }


Слушатель, приняв клиента создает форму ответа (и создает для него сетевой поток):
Код

public Form2(String hostPort, Form1 form1)
        {
            InitializeComponent();
            dataReadyToSend = new AutoResetEvent(false);
            //ссылка на форму для коректного обращения сборщика
            refToForm1 = form1;
            // разрешить локальный порт
            IPHostEntry localHost = Dns.Resolve(Dns.GetHostName());
            // создать точку входа
            IPEndPoint localEndPoint = new IPEndPoint(localHost.AddressList[0], 4001);
            // инизиализация слушателя
            tcpListener = new TcpListener(localEndPoint);
            tcpListener.Start();
            //возможность принимать клиентов
            tcp = tcpListener.AcceptTcpClient();
            //сетевой поток принятия клиента
            ethernetThreadStart = new ThreadStart(this.ThreadProcPollOnEthernet);
            //поток клиента
            pollDevicesEthernetThread = new Thread(ethernetThreadStart);
            pollDevicesEthernetThread.Name = "Поток слушателя";
            //pollDevicesEthernetThread.ApartmentState = System.Threading.ApartmentState.MTA;
            pollDevicesEthernetThread.Start();
        }


Предача данных выгядит следущ образом:

пишем в поток:
Код

string s = textBox2.Text.ToString();
Encoding enc = System.Text.Encoding.Unicode;
dataToSend = enc.GetBytes(s);
tcp.GetStream().Write(dataToSend,0,dataToSend.Length);


ну и принимаем соотвественно.


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


Помогите плз! Или подскажите где про это можно почитать в инете:
вообще про чаты (или можно примеры) или работа с сетью.

Это сообщение отредактировал(а) alir - 26.3.2005, 00:14
PM MAIL ICQ   Вверх
Gazon
Дата 27.3.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А в чем проблема? Пишешь бесконечный цикл, где будешь принимать соединение, после того как соединение принято, передаешь сокет с принятым соединением на обработку.
Т.е. примерно так:
Код

ArrayList Clients=new ArrayList();
TcpListener tcpListener=new TcpListener(65000);
tcpListener.Start();
for(;;)
{
// принимаем соединение и передаем его сокету socketForClient
// затем добавляем сокет с соединением(socketForClient) в коллекцию
// а сервер так и будет продолжать слушать новых клиентов, пока не прекратится цикл
Socket socketForClient=tcpListener.AcceptSocket();
if(socketForClient.Connected)
{
Clients.Add(socketForClient);
...
}
}

Так получился многопользовательский сервер. Т.е. коллекция Clients будет содержать соединенные с клиентами сокеты - для каждого клиента в коллекции Clients будет соединенный с ним сокет. Затем нужна какая-нибудь общая переменная для хранения всех записей в чате. И с этом переменной будут работать соединенные с клиентами сокеты в коллекции Clients.
--------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться.
PM MAIL   Вверх
alir
Дата 27.3.2005, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Затем нужна какая-нибудь общая переменная для хранения всех записей в чате.

Где ее хранить, на сервере?

Цитата
И с этом переменной будут работать соединенные с клиентами сокеты в коллекции Clients.

Так как это связать?
PM MAIL ICQ   Вверх
alir
Дата 28.3.2005, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2Gazon:
Кстати, код не работает - почему то виснет.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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