Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
 Аватар для Kayak
10 / 10 / 1
Регистрация: 02.04.2011
Сообщений: 95

Вечный сервер

19.04.2011, 09:43. Показов 2303. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, нужно поставить прием новых пользователей в цикл(если в данный момент активного нет)
Пытаюсь не закрыть сервер - новых он не принимает .
Если закрыть и открыть сервак после отключения клиента - он ловит цикл и все равно нового не берет(можно поймать ошибку Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) думал не успевает закрыться сервер - поставил ожидание, ждет и только после этого кричит ошибку).
Испробовал кучу других вариантов но результат один - второго коннекта добиться не смог.
Могу ошибаться но вроде есть параметр позволяющий подключаться к слушалке определенное кол-во раз, но инфы не нашел.

Последний catch и есть отключение клиента от сервера
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Threading;
 
namespace tcpserver
{
    class Program
    {
        static void Main(string[] args)
        {
            string cmd;
            int port = 56568;
            Server Serv = new Server(); // Создаем новый экземпляр класса 
            // сервера
            Serv.Create(port);
 
            while (true)
            {
                cmd = Console.ReadLine(); // Ждем фразы EXIT когда 
                // понадобится выйти из приложения.
                // типа интерактивность.
                if (cmd == "EXIT")
                {
                    Serv.Close(); // раз выход – значит выход. Серв-нах.
                    return;
                }
            }
        }
 
        public class Server // класс сервера.
        {
            private int LocalPort;
            private Thread ServThread; // экземпляр потока
            TcpListener Listener; // листенер))))
 
            public void Create(int port)
            {
                LocalPort = port;
                ServThread = new Thread(new ThreadStart(ServStart));
                ServThread.Start(); // запустили поток. Стартовая функция – 
                // ServStart, как видно выше
            }
 
            public void Close() // Закрыть серв?
            {
                Listener.Stop();
                ServThread.Abort();
                return;
            }
 
            private void ServStart()
            {
                Socket ClientSock; // сокет для обмена данными.
                string data;
                byte[] cldata = new byte[1024]; // буфер данных
                Listener = new TcpListener(LocalPort);
                Listener.Start(); // начали слушать
                Console.WriteLine("Waiting connections on " + Convert.ToString(LocalPort) + " port");
                try
                {
                    ClientSock = Listener.AcceptSocket(); // пробуем принять 
                    // клиента
                }
                catch
                {
                    ServThread.Abort(); // нет – жаль(
                    return;
                }
                int i = 0;
 
                if (ClientSock.Connected)
                {
                    while (true)
                    {
                        try
                        {
                            i = ClientSock.Receive(cldata); // попытка чтения 
                            // данных
                        }
                        catch
                        {
                        }
 
                        try
                        {
                            if (i > 0)
                            {
 
                                data = Encoding.ASCII.GetString(cldata).Trim();
                                Console.WriteLine("<" + data);
                                data = " ";
                                if (data == "CLOSE") // если CLOSE – 
                                // вырубимся
                                {
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
                                    ClientSock.Close();
                                    Listener.Stop();
                                    Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
                                    ServThread.Abort();
                                    return;
                                }
                                else
                                { // нет – шлем данные взад.
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Your data: " + data));
                                }
                            }
                        }
                        catch
                        {
                            ClientSock.Close(); //
                            Listener.Stop();
                            Console.WriteLine("Client disconnected. Server closed.");
                            ServThread.Abort();
                        }
                    }
                }
            }
        }
    }
}
Подскажите как реализовать нечто подобное в мейне, у самого пока не хватает знания языка
C#
1
while (Serv.Close = true){Serv.Create(port);}
данный код выдает ошибку Cannot convert method group 'Close' to non-delegate type 'bool'. Did you intend to invoke the method?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.04.2011, 09:43
Ответы с готовыми решениями:

Как сделать вечный цикл?
Всем привет . Я хочу сделать некий замкнутый круг который будет всё время выполнения программы проверять код страницы и только если он...

Зависание (возможно где то вечный цикл)
При нажатии на кнопку зависает всё. Ошибок компиляции нет. В чём проблема. Вот код: private void button1_Click(object sender, EventArgs e) ...

Вечный "?" Создание обратной матрицы. Нахождение детерминанта
Возможно у кого- нибудь есть нормальный готовый код. Буду рад если дадите. Суть вот в чём. Я уже замучился искать код для создания...

10
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
19.04.2011, 10:48
Цитата Сообщение от Kayak Посмотреть сообщение
while (Serv.Close = true)
тут вы что делаете? Close этот метод, а значит как минимум пустые скобки должны быть, и операция сравнения должны быть с двумя ==.
C#
1
while (Serv.Close() == true){Serv.Create(port);}
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
19.04.2011, 10:57
nuke4303, а смысл вообще его пытаться сравнивать с true, если сам метод void?
0
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
19.04.2011, 11:01
Цитата Сообщение от znake Посмотреть сообщение
nuke4303, а смысл вообще его пытаться сравнивать с true, если сам метод void?
Я не кодил сервера, поэтому незнаю что он там возвараащет...но может быть он возвращает закрылся ли сервер или нет, или еще чтонить после сзакрытия сервера...хотя вы логично рассуждаете, обычно close возвращет void. Я просто поправил написанный код автора, не вдаваясь в смысл.
Может быть автор перепутал метод клоус со свойством типа IsClose
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2011, 11:03
А зафигом весь сервак закрывать? Надо освобождать только тот сокет, на который была переадресация закрывшегося клиента.
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
19.04.2011, 11:27
nuke4303, Serv - объект класса Server. класс Server описывает сам автор, и метод Close, соответственно, тоже:
C#
1
2
3
4
5
6
            public void Close() // Закрыть серв?
            {
                Listener.Stop();
                ServThread.Abort();
                return;
            }
Kayak, я как бы тоже не особо пока понял, что ты пытаешь сделать, но если ты хочешь использовать конструкцию
C#
1
while (Serv.Close() == true){Serv.Create(port);}
то тебе надо сделать, чтобы метод Close возвращал булево значение....и соответственно в самом методе сделать этот возврат...
1
 Аватар для Kayak
10 / 10 / 1
Регистрация: 02.04.2011
Сообщений: 95
20.04.2011, 12:35  [ТС]
Цитата Сообщение от znake Посмотреть сообщение
Kayak, я как бы тоже не особо пока понял, что ты пытаешь сделать, но если ты хочешь использовать конструкцию
Не обязательно использовать это да и прицеплять ответ к Close думаю лишнее, код привел только ради примера как по моему это будет лучше, а проблема простая :
есть сервер и клиент, все конектятся и работают но после отключения клиента закрывается и сервер , а мне нужно после закрытия сессии потом снова подключится к серверу, тоесть он будет принимать подключения не 1 раз а постоянно(в идеале подключение удачно если в данный момент активных нет, но думаю это сам допилю)

Попытаюсь конкретизировать вопрос, как в последнем Catch снова выполнить метод Main , если return; не работает, получится при закрытии сервер он будет открываться снова.
C#
1
2
3
4
5
6
7
                        catch
                        {
                            ClientSock.Close(); //
                            Listener.Stop();
                            Console.WriteLine("Client disconnected. Server closed.");
                            ServThread.Abort();
                        {
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
20.04.2011, 13:07
Ты используешь прямые обработчики, в то время как нужны асинхронные. Имена этих процедур начинаются с Begin, П.П BeginAcceptSocket
1
 Аватар для Kayak
10 / 10 / 1
Регистрация: 02.04.2011
Сообщений: 95
20.04.2011, 16:33  [ТС]
Решил проблему внеся создание сервера в While что в мейне.
Но тут подкрадывается другой косяк что-бы закрыть цикл необходимо вписать что-то ручками в консоль, writeline не пашет. Подозреваю что в последний catch

C#
1
2
3
4
5
6
7
8
9
  
                         catch
                      {
                            ClientSock.Close(); //
                            Listener.Stop();
                            Console.WriteLine("Client disconnected. Server closed.");
                            ServThread.Abort();
 
                        }
И нюанс хотелось бы из клиента закрывать сервер, вроде код правильный но не работает, подскажите где ошибка?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                         Console.WriteLine("<" + data);
                                data = " ";
                                if (data == "close") // если close – 
                                // вырубимся
                                {
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
                                    ClientSock.Close();
                                    Listener.Stop();
                                    Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
                                    ServThread.Abort();
                                    return;
                                }
                                else
                                { // нет – шлем данные взад.
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Your data: " + data));
                                }
Вот весь сервак для обзора
Листинг
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Threading;
 
namespace tcpserver
{
    class Program
    {
        static void Main(string[] args)
        {
            string cmd;
            int port = 56568;
            Server Serv = new Server(); // Создаем новый экземпляр класса 
            // сервера
            
 
            while (true)
            {
                Serv.Create(port);
 
                cmd = Console.ReadLine(); // Ждем фразы EXIT когда 
                // понадобится выйти из приложения.
                // типа интерактивность.
                if (cmd == "EXIT")
                {
                    Serv.Close(); // раз выход – значит выход. Серв-нах.
                    return;
                }
            }
        }
 
        public class Server // класс сервера.
        {
            private int LocalPort;
            private Thread ServThread; // экземпляр потока
            TcpListener Listener; // листенер))))
 
            public void Create(int port)
            {
                LocalPort = port;
                ServThread = new Thread(new ThreadStart(ServStart));
                ServThread.Start(); // запустили поток. Стартовая функция – 
                // ServStart, как видно выше
            }
            public void Close() // Закрыть серв?
            {
                Listener.Stop();
                ServThread.Abort();
                return;
            }
 
            private void ServStart()
            {
                Socket ClientSock; // сокет для обмена данными.
                string data;
                byte[] cldata = new byte[1024]; // буфер данных
                Listener = new TcpListener(LocalPort);
                Listener.Start(); // начали слушать
                Console.WriteLine("Waiting connections on " + Convert.ToString(LocalPort) + " port");
                try
                {
                    ClientSock = Listener.AcceptSocket(); // пробуем принять клиента
                    Console.WriteLine("Client Connected Yahooo");
                }
                catch
                {
                    ServThread.Abort(); // нет – жаль(
                    Console.WriteLine("Client not connected Boooooo");
                    return;
                }
                int i = 0;
 
                if (ClientSock.Connected)
                {
                    while (true)
                    {
                        try
                        {
                            i = ClientSock.Receive(cldata); // попытка чтения 
                            // данных
                        }
                        catch
                        {
                        }
 
                        try
                        {
                            if (i > 0)
                            {
 
                                data = Encoding.ASCII.GetString(cldata).Trim();
                                Console.WriteLine("<" + data);
                                data = " ";
                                if (data == "close") // если CLOSE – 
                                // вырубимся
                                {
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
                                    ClientSock.Close();
                                    Listener.Stop();
                                    Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
                                    ServThread.Abort();
                                    return;
                                }
                                else
                                { // нет – шлем данные взад.
                                    ClientSock.Send(Encoding.ASCII.GetBytes("Your data: " + data));
                                }
                            }
                        }
                        catch
                        {
                            ClientSock.Close(); //
                            Listener.Stop();
                            Console.WriteLine("Client disconnected. Server closed.");
                            ServThread.Abort();
 
                        }
                    }
                }
            }
        }
    }
}
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
20.04.2011, 16:53
Посмотри тут:
1. TcpListener
2. Socket

Лучше всего первый вариант, т.к. он не накладывает ограничений на количество подключаемых клиентов. А в твоем коде могу предложить вынести создание сервера в отдельный поток и связать его с Main через глобальную переменную или добавить публичное свойство в твой класс сервера. Больше ничего в голову не приходит.

Что происходит при получении сообщения "close"? попробуй поставить там брейкпоинт и пошагово пройти этот участок.
1
 Аватар для Kayak
10 / 10 / 1
Регистрация: 02.04.2011
Сообщений: 95
22.04.2011, 00:56  [ТС]
После отключения клиента нужно вписать любой символ в консоль и сервер перезагружается (заканчивается цикл while) но Console.WriteLine не работает.Пробовал и создавать отдельный класс для отключения клиента все бесполезно.
Ожидет текст после закрытия сервера он изза cmd = Console.ReadLine();
C#
1
2
3
4
5
6
7
8
9
10
             while (true)
            {
                Serv.Create(port);
                cmd = Console.ReadLine(); 
                if (cmd == "EXIT")
                {
                    Serv.Close(); 
                    return;
                }
            }
В мейне , без этого постоянно открываются сервера (цикл то активен). Собственно вопрос - чем заменить Console.ReadLine() что-бы не плодить сервера но и получить цикличность? Необходим то всего 1 клиент.

Листинг мейна
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        static void Main(string[] args)
        {
            string cmd;
            int port = 56568;
            Server Serv = new Server(); // Создаем новый экземпляр класса сервера
            //ServThread = new Thread(new ThreadStart(ServStart));
            //ServThread.Start();
 
            while (true)
            {
                Serv.Create(port);
 
                cmd = Console.ReadLine(); .
                if (cmd == "EXIT")
                {
                    Serv.Close();
                    return;
                }
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2011, 00:56
Помогаю со студенческими работами здесь

"Вечный календарь"
&quot;Вечный календарь&quot;. По дате 23.04.2039 или другой дате XXI века определить день недели. Напечатать календарь на текущий месяц. ...

Зависает сервер при создании приложения типа клиент/сервер
Зависает сервер при создании приложения типа клиент/сервер using System; using System.Collections.Generic; using...

Http-сервер: Как сделать чтоб этот сервер понимал файлы расширением .php и .aspx
Здравствуйте друзья Как сделать чтоб этот сервер понимал файлы расширением .php и .aspx? Простые странички он понимает нормально ...

Сервер на сокетах: невозможно повторно запустить сервер
пишу сервер на сокетах, но надо не в консоли, а на Windows Forms, значит по кнопке у меня сервер стартует, на кнопке я пишу помимо прочего...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст(1 строка). Как...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru