Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 02.12.2010
Сообщений: 23

Instant Messeneger

07.12.2010, 04:42. Показов 1086. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Хочу написать простейшую программу для обмена сообщениями.
Есть многопоточный сервер, и клиенты, которые соединяются к нему. Я хочу реализовать отправку личных сообщений от одного клиента к другому и конференции.
Догадываюсь, что нужно как-то связывать логин клиента с открываемым им потоком, а серверу отсылать логин адресата. Сервер, увидев логин адресата, направляет сообщение через нужный поток.
Проблема в том, что я не пойму как это реализовать.
Код сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
namespace EchoServer
{
    public class ClientHandler
    {
        public TcpClient clientSocket;
        public void RunClient()
        {
            StreamReader readerStream = new StreamReader(clientSocket.GetStream());
            NetworkStream writerStream = clientSocket.GetStream();
 
            string returnData = readerStream.ReadLine();
            string userName = returnData;
            Console.WriteLine("Welcome " + userName + " to the Server");
            while(true)
            {
                returnData = readerStream.ReadLine();
                if (returnData.IndexOf("QUIT") > -1)
                {
                    Console.WriteLine("Bye bye {0}",userName);
                    break;
                }
                Console.WriteLine(userName + ": " + returnData);
                returnData += "\r\n";
                byte[] dataWrite = Encoding.UTF8.GetBytes(returnData);
                writerStream.Write(dataWrite, 0, dataWrite.Length);
            }
            clientSocket.Close();
        }
    }
    public class EchoServer
    {
        const int echo_port = 8080;
        public static int nClients = 0;
 
        static void Main(string[] args)
        {
            try
            {
                TcpListener clientListener = new TcpListener(echo_port);
                clientListener.Start();
                Console.WriteLine("W8ing 4 conn!");
 
                while (true)
                {
                    TcpClient client = clientListener.AcceptTcpClient();
                    ClientHandler cHandler = new ClientHandler();
                    cHandler.clientSocket = client;
                    Thread clientThread = new Thread(new ThreadStart(cHandler.RunClient));
                    clientThread.Start();
 
                }
                clientListener.Stop();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
 
    }
}
Код клиента:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
namespace EchoClient
{
    class Program
    {
        const int echo_port = 8080;
        static void Main(string[] args)
        {
            Console.WriteLine("Write ur name: ");
            string userName = Console.ReadLine();
            Console.WriteLine("---Logged in-->");
 
            try
            {
                TcpClient eClient = new TcpClient("127.0.0.1", echo_port);
                StreamReader readerStream = new StreamReader(eClient.GetStream());
                NetworkStream writerStream = eClient.GetStream();
 
                string dataToSend;
                dataToSend = userName;
                dataToSend += "\r\n";
                byte[] data = Encoding.UTF8.GetBytes(dataToSend);
                writerStream.Write(data, 0, data.Length);
 
                while (true)
                {
                    Console.WriteLine(userName + ": ");
                    dataToSend = Console.ReadLine();
                    dataToSend += "\r\n";
                    data = Encoding.UTF8.GetBytes(dataToSend);
                    writerStream.Write(data, 0, data.Length);
                    if (dataToSend.IndexOf("QUIT") > -1) break;
 
                    string returnData;
                    returnData = readerStream.ReadLine();
                    Console.WriteLine("Server: " + returnData);
                }
                eClient.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}
Надеюсь на вашу помощь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2010, 04:42
Ответы с готовыми решениями:

Instant Messaging
Доброго времени суток! Вопрос!!! При первом запуске Lotus Notes не настраивал Instant messaging. Как потом его запустить, не...

HDD instant
HDD instant Recovery Utility v2.2 что это ,переустановил систему xp.

Instant Messaging Server
Добрый день! Никто не знает, для чего в адресной книге есть поле Instant messaging server?Может что-то автоматически настраиваться будет?

3
38 / 38 / 5
Регистрация: 03.06.2010
Сообщений: 120
07.12.2010, 09:34
Ну как. На сервере нужно сделать Dictionary. При коннекте пользователя нужно в этот словарь добавлять пару логин-сокет. Допустим, присоединилось к серверу 2 пользователя : A и B . А при соединении добавляет пару "А"-"8081" , а "B"-"8082" . Затем пользователь А хочет отправить сообщение пользователю B. На сервере в словаре находим значение порта (сокета) для пользователя В и туда отправляем сообщение.
При этом должен быть метод ConnectToServer(string userName) у пользователя. Этот метод должен возвращать номер сокета, который сервер выделяет для клиента. Т.е. описание метода такое :
int ConnectToServer(string userName)
{
//заносим в словарь.
если неудачно, то возвращаем -1 или другой код ошибки.
}
Ну и на клиенте должен быть метод Disconnect. (просто удаляем из Dictionary этого пользователя).
Вооот. Как-то так логика должна быть организована . Хотя наверняка есть и другие способы. В случае чего могу выложить исходник чата. Только он вообще без серверной части

P.S . Все пользователи должны коннеститься на порт 8080 (назовем его базовым портом).
0
1 / 1 / 0
Регистрация: 02.12.2010
Сообщений: 23
07.12.2010, 16:15  [ТС]
Пришли пожалуйста исходник
0
38 / 38 / 5
Регистрация: 03.06.2010
Сообщений: 120
08.12.2010, 10:47
Посмотрел я тут свой исходник. Он , во-первых, как-то криво работает. А во-вторых, там я не так делал. Без словарей и т.п. Извини, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2010, 10:47
Помогаю со студенческими работами здесь

Как настроить Instant Messaging?
Подскажите как можно настроить и организовать сервис Instant Mesaging? Я так полагаю, что существует такой "ограниченный"...

Конструктор форм v1.10.3 instant cms
Помогите,пожалуйста, убрать капчу из Конструктора форм v1.10.3 instant cms. Раньше получалось без проблем,а в обновленной версии не выходит(

Как запустить Instant Messanger
Доброго всем времени суток . Как запустить службу Instant messanger на сервере. делаю пинг на порт 1533 не доступен значит на нем нисего...

Instant boot и включение компьютера с клавиатуры
Привык включать компьютер нажатием любой клавиши на клавиатуре, с использованием instant boot он уже так не включается, только кнопкой на...

Взяли ли разработчики Instant CMS за основу Yii Framework или нет?
Здраствуйте, не так давно начал разбираться с Yii framework, и уже заметил некоторые схожести этого фреймворка с Instant CMS. Хочется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru