Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/78: Рейтинг темы: голосов - 78, средняя оценка - 4.64
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723

Многопоточный клиент-сервер

14.05.2010, 20:51. Показов 14571. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
начал разбираться с сетями, и столкнулся с такой проблемой... когда 1 клиент и 1 сервер, то тут все понятно... а вот когда один ко многим (1 сервер и много клиентов) возникают проблемы... не как не могу понять следующее, я на сервере жду подключений
C#
1
2
3
4
5
6
7
8
9
10
            // Создаем TCP сервер и слушаем запросы клиентов
            TcpListener server = new TcpListener(IPAddress.Any,11000);
            server.Start();
 
                        // Проверяем, есть ли клиенты
            while (true)
            {
                server.AcceptTcpClient();
                Console.WriteLine("...Подключен клиент...");
            }
так вот подключаюсь на клиенте
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
        public void ConnectClient()
        {
            TcpClient client = new TcpClient();
            bool connect = false;
            
            while (!connect)
            {
                try 
                {
                    client.Connect("localhost",11000);
                } 
                catch (SocketException e) 
                {
                    if (!client.Connected) 
                    {   
                    toolStripStatusText.Text = e.Message;
                    }
                    else
                    {   
                        toolStripStatusText.Text = "Подключен";
                        connect = true;
                    }
                }   
            }
        }
вот вопросы:
1) как создать потоки, что бы организовать еще и передачу и прием сообщений?
ведь пока сервер слушает порт, он не может нечего делать другова)
2) как вообще лучше организовать передачу сообщений? должна быть функция как один к одному между клиентами, так и отправка сервисных сообщений от сервера ко всем клиентам
3) как понять какой клиент передал данные и кому передал?
пытался каждое подключение занести в список, но получается довольно сложно определять от кого и кому пишешь... можно ли передать какой то индификатор или параметр клиента, что бы опредлять от кого и кому посылаешь, я имею ввиду при создании подключения)
в заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2010, 20:51
Ответы с готовыми решениями:

многопоточный сервер TCP
Создал сервер TCP, но нужно его переделать на многопоточный, что-бы могло подключиться большое количество пользователей одновременно. Вот...

Многопоточный TCP сервер
Доброго времени суток! Я уже долгое время пытаюсь написать сервер, который может принимать много соединений с многими клиентами...

Передача сервер к выбраному клиенту (многопоточный)
using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; using System.Threading; using...

14
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
14.05.2010, 21:47
http://www.microsoft.com/Rus/M... nsock.mspx
1
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
14.05.2010, 22:33  [ТС]
Цитата Сообщение от HIMen Посмотреть сообщение
тоесть ты хочешь сказать что лучше использовать сокеты? а чем плохи тспКлиент`ы?
0
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
15.05.2010, 02:39
Цитата Сообщение от Sequd Посмотреть сообщение
тоесть ты хочешь сказать что лучше использовать сокеты? а чем плохи тспКлиент`ы?
TCPClient - тот же сокет, просто предназначен для работы с протоколом TCP, сокеты имеют более расширенные возможности, работая с многими протоколами. По сути разници нету, используйте то что Вам по душе и с чем удобнее работать.
1
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
15.05.2010, 16:53  [ТС]
ну а вот на моем примере, как многопоточность сделать? создать еще один потом для отправки и получения?
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
15.05.2010, 20:25
1) после того как кто-то подключился создавай новый поток и уже в нем делай все обработки, AcceptTcpClient как раз возвращает новый объект подключения, вот его бери и мучай в отдельных потоках, а сервер будет дальше ждать новых подключений

а ко второму и третьему вопросам сам присоединяюсь ))) особенно интересует рассылка "один ко всем"
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
16.05.2010, 01:49
Цитата Сообщение от Sequd Посмотреть сообщение
ну а вот на моем примере, как многопоточность сделать?
Смотрите в том примере, с TcpClient все тоже самое.
Общая схема сервера:
Создаете класс Client, который будет хранить информацию о каждом клиенте, например сокет и идентификатор.
Сервер бесконечно ждет подключения нового клиента, при подключении выделяет его в отдельный поток (явно, либо с помощью BeginReceive и подобных и обрабатываете через функции обратного вызова), и добавляет в список.
Создаете методы, например отправка сообщения конкретному клиенту (по идентификатору) или всем.
Массовая рассылка возможна также через широковещательный сокет.

В данной схеме клиенту друг у друге ничего не знают, поэтому если хотите послать сообщение от одного клиента другому, надо слать сообщение с указанным адресатом серверу, а сервер отправит адресату
1
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
16.05.2010, 15:02  [ТС]
Цитата Сообщение от HIMen Посмотреть сообщение
Сервер бесконечно ждет подключения нового клиента, при подключении выделяет его в отдельный поток
каждого клиента в новый поток? а если их несколько тысяч или и того больше? не сильно ли это будет грузить и есть память?
Цитата Сообщение от HIMen Посмотреть сообщение
явно, либо с помощью BeginReceive и подобных и обрабатываете через функции обратного вызова
а можно немного по подробнее?)

Цитата Сообщение от HIMen Посмотреть сообщение
добавляет в список.
в обычный List<>?
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
16.05.2010, 15:10
Цитата Сообщение от Sequd Посмотреть сообщение
каждого клиента в новый поток? а если их несколько тысяч или и того больше? не сильно ли это будет грузить и есть память?
Ну да, но с асинхронными методами побыстрее будет
Цитата Сообщение от Sequd Посмотреть сообщение
а можно немного по подробнее?)
Все по той же ссылке есть примеры
Цитата Сообщение от Sequd Посмотреть сообщение
в обычный List<>?
Да, хотя если идентификаторы уникальные можно в словарь
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
16.05.2010, 22:11  [ТС]
в общем не получается что то...
пытался сделать так
Код

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
public class Server
    {
        // Создаем TCP сервер и слушаем запросы клиентов
        TcpListener server;
        List<ConnectInfo> connections = new List<ConnectInfo>();
        ConnectInfo connection;
 
        public void StartServer()
        {
            server = new TcpListener(IPAddress.Any, 11000);
            server.Start();
            Console.WriteLine("--- Сервер Запущен ---");
 
            // Проверяем, есть ли клиенты в очереди
            while (server.Pending())
            {
                Console.WriteLine("Есть клиенты в очереди...");
                connection.Client = server.AcceptTcpClient();
                connection = new ConnectInfo();
                
                connection.Thread = new Thread(ProcessConnection);
                connections.Add(connection);
                Console.WriteLine("Подключаем клиентов из очереди...");
                Console.WriteLine("...Подключен клиент из очереди...");
            }
            Console.WriteLine("Клиентов в очереде нет...");
            Console.WriteLine("Ожидаем подключений...");
 
            // Ждем соединения с клиентами
            while (true)
            {
                try
                {
                    connection.Client = server.AcceptTcpClient();
                    connection = new ConnectInfo();
                    connection.Thread = new Thread(ProcessConnection);
                    connections.Add(connection);
                    Console.WriteLine("...Подключен клиент...");
                }
                catch (SocketException se)
                {
                    Console.WriteLine(se.Message);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                }
            }
 
        public void ProcessConnection(object state)
        {
 
        }
    }
 
    class ConnectInfo
    {
        public Thread Thread;
        public TcpClient Client;
    }

что то не получилось...
что не так? как правильно то сделать?
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
18.05.2010, 23:29  [ТС]
ну подскажите кто нить, как потоки тут создать?
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
21.05.2010, 21:38  [ТС]
подскажите в чем проблема, все написал, кое как все работает... но вот с удаленной машины подключаться не хочет, в чем дело? вроде нече не блочит, но выдает что сервер не откликнулся
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                try 
                {
                    IPAddress address = IPAddress.Parse("95.79.179.53");
                    IPEndPoint end = new IPEndPoint(address, 11000);
 
                    client.Connect(end);
                    if(client.Connected)
                    {
                        richTextBoxRecive.Text = "ПОДКЛЮЧЕН";
                        toolStripStatusText.Text = "Подключен";
                        threadRecive = new Thread(new ThreadStart(Recived));
                        threadSend = new Thread(new ThreadStart(Send));
                        threadRecive.Start();
                        threadSend.Start();
                    }
                }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
clients = new List<Client>();   
                Random rand = new Random();
                // Создаем TCP сервер и слушаем запросы клиентов
                TcpListener server = new TcpListener(IPAddress.Any,11000);
                server.Start();
                Console.WriteLine("--- Сервер Запущен ---");
                
                                // Ждем соединения с клиентами
                while (true)
                {
                    clients.Add(new Client(server.AcceptTcpClient(), rand.Next(5000)));
                    Console.WriteLine("...Подключен клиент...");
                }
1
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
21.05.2010, 22:18
а IP адрес-то выделенный?
т.е это адрес чисто компа где запущен сервер, или адрес шлюза через который сидит пол района ?))
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
21.05.2010, 22:35  [ТС]
статически, от провайдера...
0
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 4
09.02.2011, 15:01
ммм тут остался открытым вопрос о передаче данных полученных в потоке от сервера в какой нить буфер основного потока, а самое главное как отловить момент когда данные получены, сохранены и их можно брать.
грубо говоря, если сервер должен передать на запрос клиента какие то данные, а соединение с сервером идёт в отдельном потоке, как потом полученные данные взять из потока и работать с ними в главном потоке, ну например вывести в текстбокс, или отпарсить и делать что то другое, например дерево в треевиве построить, да это не суть как важно, важно как запустить парсер по событию завершению работы соединения, какое событие ловить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2011, 15:01
Помогаю со студенческими работами здесь

Многопоточный сервер: доступ клиентов к данным
Здравствуйте нашёл в интернете многопоточный сервер using System; using System.Collections.Generic; using System.Linq; using...

Как организовать многопоточный сервер через сокеты
Ребят, как создать сервер, который работает через сокеты и принимает сообщения от нескольких клиентов и на каждое принятое от них сообщение...

Решил сделать свой асинхронный многопоточный сервер
Итак. Цель создать асинхронный многопоточный сервер для MMOFPS (онлайн шутер от первого лица) на C#. Соответственно план такой: 1)...

Многопоточный сервер TCP: разослать сообщения по всем клиентам
Есть tcp сервер, который принимает данные от клиентов и выводит в консоль, и дает ответ клиенту. Уже сутки не могу решить одну...

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит копию сокета и всякую инфу клиента, и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru