Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
CBF
1

Echo Server

15.10.2013, 19:26. Показов 3942. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
В С# я новичек, поэтому просьба не судить строго.
Задача - написать простой echo сервер. Подключение к серверу любым клиентом(telnet,putty).
Задача выполнена, привожу свою реализацию ниже. Огромная просьба прокомментировать код.

Класс самого сервера:

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
using System;
using System.Net;
using System.Net.Sockets;
 
class Server
{
        TcpListener Listener;
 
        public Server(int port)
        {
            Console.WriteLine("Сервер запущен, слушает порт " + port);
            Listener = new TcpListener(IPAddress.Any, port);
            Listener.Start();
 
            while (true)
            {
                // Принимаем новых клиентов
                Client client = new Client(Listener.AcceptTcpClient());
                Console.WriteLine("Новый клиент подключился с IP: " + client.getIP());
                client.sendMessage("Вы подключены к серверу.\n\r");
            }
        }
 
        ~Server()
        {
            if (Listener != null)
            {
                // Остановим его
                Listener.Stop();
            }
        }
 
}
Класс-обработчик входящих соединений:
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
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
 
class Client
{
    private TcpClient socket;
 
    public Client(TcpClient client)
    {
        this.socket = client;
    }
 
    ~Client()
    {
        if (this.socket != null)
        {
            this.socket.Close();
        }
    }
 
    public void sendMessage(String msg)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(msg);
        this.socket.GetStream().Write(buffer, 0, buffer.Length);
        Thread receiveThread = new Thread(receiveMessage);
        receiveThread.Start();
    }
 
    public String getIP()
    {
        return this.socket.Client.RemoteEndPoint.ToString();
    }
 
    private void receiveMessage()
    {
        while (socket.Connected)
        {
            byte[] buffer = new byte[socket.Available];
            this.socket.GetStream().Read(buffer, 0, buffer.Length);
            String message = Encoding.UTF8.GetString(buffer);
            sendMessage(message);
        }
    }
}
Main:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            new Server(2100);
        }
    }
}
Мои вопросы/наблюдения:
1)
C#
1
2
3
4
5
6
private void receiveMessage()
    {
        while (socket.Connected)
        {
 byte[] buffer = new byte[socket.Available];
            this.socket.GetStream().Read(buffer, 0, buffer.Length);
Последняя операция является блокирующей? Т.е. выполнение while(socket.Connected) будет приостановлено до тех пор, пока на сокете не появятся входящие данные?

2)
C#
1
 Thread receiveThread = new Thread(receiveMessage);
Запускает отдельный поток на receiveMessage? Не вызовёт ли это большую нагрузку при большом количестве клиентов? Может быть использовать пул потоков? Тыкните пожалуйста где почитать про это

3) Как отлавливать закрытие сокета в TcpClient?

4) Что здесь можно улучшить?

Добавлено через 2 часа 16 минут
Я извиняюсь, может не в том разделе тему создал? Тишина такая.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2013, 19:26
Ответы с готовыми решениями:

C# Microphone to headphones. Echo.
Всем снова здравствуйте. Начал с C++, но послал его ибо это есть бред. То есть нет - бреда как раз...

Вывести символы, используя только три ECHO. Echo '0', Echo '*', Echo '\n' (использовать цикл)
Вывести символы, используя только три ECHO. Echo '0', Echo '*', Echo '\n' (использовать цикл)....

Какие аналоги есть для Acronis true image Echo Enterprise Server для Windows Server 2012?
Искал эту программу для Windows Server 2012 но не нашел. Не поддерживается. Помогите пожалуйста!

Не работает echo server
Не работает echo server(открытый канал не приходит на фронт, а закрытый выдаёт ошибку) в open-...

0
15.10.2013, 19:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 19:26
Помогаю со студенческими работами здесь

Прокомментировать код ECHO Server
Мне нужно написать ECHO Server,(только его клиента не надо) который будет из командной строки брать...

Echo Server не работает Private Channel - Client can not be authenticated, got HTTP status 405
https://medium.com/@dennissmink/laravel-echo-server-private-channels-267a9e57bae9 ...

Где ошибка в коде? for ($j=0;$j<=$i;$j++) {echo 'dbadd('.$arr[$j].')'; echo 'document.writeln(db['.$j.']);';}
Должен ли работать такой код? &lt;?php echo '&lt;script language= 'javascript '&gt;'; echo '&lt;!--'; for...

eclipse показывает ошибку в echo("ddd"); что не определен метод echo
package MyUtill; public class Print { public static void echo(String s){...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru