Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/103: Рейтинг темы: голосов - 103, средняя оценка - 4.86
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842

Обмен сообщениями через протокол Tcp

06.04.2010, 00:02. Показов 19169. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, форумчане! Христос Воскресе!

Собственно, задание: Напишите программу, которая при запуске устанавливает TCP соединение с заданным сервером и открывает в пассивном режиме заданный порт TCP. После подключения к этому порту клиента, программа в цикле принимает данные от
клиента, передаёт их серверу, получает ответ сервера и возвращает его клиенту. После отключения клиента программа должна завершиться.

Код клиент:
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
public partial class Client : Form
    {
        string IP;
        string Port;
        Socket socket;
        EndPoint end;
 
 
        public Client(string ip, string port)
        {
            InitializeComponent();
            this.IP = ip;
            this.Port = port;
            Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            socket.Disconnect(true);
            Application.Exit();
        }
 
        private void Client_Load(object sender, EventArgs e)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(IP);
            IPEndPoint ipe = new IPEndPoint(ip, int.Parse(Port));
            end = (EndPoint)ipe;
            try
            {
                socket.Connect(ipe);
                this.Text += " - Соединение установлено";
            }
            catch 
            {
                MessageBox.Show("Проблемы с установкой соединения.\nПриложение будет закрыто.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
 
        private delegate void Answer();
 
        private void button2_Click(object sender, EventArgs e)
        {
            string str = richTextBox1.Text;
            byte[] buffer = Encoding.Default.GetBytes(str);
            socket.Send(buffer, buffer.Length, 0);
            new Answer(delegate() { Answ(); }).BeginInvoke(null, null);
        }
 
        private void Answ() 
        {
            byte[] answer=new byte[64];
            socket.ReceiveFrom(answer, 0, ref end);
            textBox1.Text = Encoding.Default.GetString(answer);
        }
    }
Сервер:
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
public partial class Server : Form
    {
        Socket socket;
        Socket client;
        IPEndPoint ipe;
        byte[] buffer;
 
        public Server()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            ipe = new IPEndPoint(ip, 8080);
            socket.Bind(ipe);
            socket.Listen(100);
            label1.Text = "Порт в режиме ожидания соединения";
            new Connect(delegate() { Conect(); }).BeginInvoke(null, null);
        }
 
        private void Conect() 
        {
            client = socket.Accept();
            label1.Text = "Соединение установлено";
        }
 
        private delegate void Connect();
 
        private void SendMessage() 
        {
            buffer = new byte[256];
            client.Receive(buffer, buffer.Length, 0);
            richTextBox1.Text += Encoding.Default.GetString(buffer);
            string str = "Сообщение получено";
            byte[] service = Encoding.Default.GetBytes(str);
            client.Send(service, service.Length, 0);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            SendMessage();
        }
    }
В принципе, все реализовано. Но не получается пока реализовать этот момент: После отключения клиента программа должна завершиться.
И еще - как заставить сервер автоматически принять данные после их отправки от клиента.

PS: нельзя использовать стандартные классы типа TcpClient. Заранее предупреждаю, чтобы не постили лишнего.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2010, 00:02
Ответы с готовыми решениями:

Обмен файлами и сообщениями через интернет
Мне надо сделать программу, которая будет обмениваться сообщениями с такой-же программой на другом компе.Мне надо будет передавать файлы(до...

Вывод изображения через TCP\IP протокол
Всем привет ! У кого-нибудь есть примеры того, как получать видео, передаваемое посредством сетевого протокола TCP\IP ? У меня есть...

программа, которая отсылает на сервер пакеты через TCP протокол
Есть программа, которая отсылает на сервер пакеты через TCP протокол, она их и получает. Необходимо написать приложение, которое будет...

5
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.04.2010, 00:41
Отличная статья по сокетам, думаю поможет http://www.microsoft.com/Rus/M... nsock.mspx
1
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
06.04.2010, 11:25  [ТС]
Вообщем, возникшие вопросы решил так:
Клиент
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
public partial class Client : Form
    {
        // делегат для получения ответа
        private delegate void Answer();
 
        string IP;
        string Port;
        Socket socket;
        EndPoint end;
 
        public Client(string ip, string port)
        {
            InitializeComponent();
            this.IP = ip;
            this.Port = port;
            // чтобы не ругалось на то, что компоненты формы
            // используются в другом потоке
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        // кнопка закрытия формы
        private void button1_Click(object sender, EventArgs e)
        {
            socket.Close();
            Application.Exit();
        }
 
        private void Client_Load(object sender, EventArgs e)
        {
            // инициализация сокета
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // создание параметра для подключения к серверу
            IPAddress ip = IPAddress.Parse(IP);
            IPEndPoint ipe = new IPEndPoint(ip, int.Parse(Port));
            end = (EndPoint)ipe;
            try
            {
                socket.Connect(ipe);
                this.Text += " - Соединение установлено";
            }
            catch // на случай каких-либо проблем
            {
                MessageBox.Show("Проблемы с установкой соединения.\nПриложение будет закрыто.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
        // отправка сообщения
        private void button2_Click(object sender, EventArgs e)
        {
            string str = richTextBox1.Text;
            byte[] buffer = Encoding.Default.GetBytes(str);
            socket.Send(buffer, buffer.Length, 0);
            // ожидание ответа от сервера
            new Answer(delegate() { Answ(); }).BeginInvoke(null, null);
        }
        // метод для получения ответа
        private void Answ() 
        {
            byte[] answer=new byte[64];
            socket.ReceiveFrom(answer, 0, ref end);
            textBox1.Text = Encoding.Default.GetString(answer);
        }
        // очистка окна сообщений от сервера
        private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
        {
            textBox1.Text = "";
        }
    }
Сервер
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
public partial class Server : Form
    {
        // делегат для ожидания соединения
        private delegate void Connect();
        // делегат для приема сообщений
        private delegate void Send();
 
        Socket socket;
        Socket client;
        EndPoint end;
        byte[] buffer;
 
        public Server()
        {
            InitializeComponent();
            // чтобы не ругалось на то, что компоненты формы
            // используются в другом потоке
            Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация сокета
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // говорим, чтобы сервер использовал любой ip
            IPAddress ip = IPAddress.Any;
            // созаем параметр для привязки сокета к адресу
            IPEndPoint ipe = new IPEndPoint(ip, 8080);
            end = (EndPoint)ipe;
            // привязка сокета к адресу
            socket.Bind(ipe);
            // указываем количество запросов на соединение в очереди
            socket.Listen(1);
            label1.Text = "Порт в режиме ожидания соединения";
            // выполняется асинхронно в потоке, тем самым программа не зависает
            new Connect(delegate() { Conect(); }).BeginInvoke(null, null);
        }
        // подключение клиента к серверу
        private void Conect() 
        {
            client = socket.Accept();
            label1.Text = "Соединение установлено";
        }
        // метод для получения сообщений и отправки ответа
        private void SendMessage() 
        {
            try
            {
                // получение сообщения
                buffer = new byte[256];
                client.ReceiveFrom(buffer, ref end);
                Mess(buffer);
                // отправка ответа
                string str = "Сообщение получено";
                byte[] service = Encoding.Default.GetBytes(str);
                client.Send(service, service.Length, 0);
            }
            catch // если соединение разовано, то завешение приложения
            {
                Quit();
            }
        }
        // кнопка выхода
        private void button1_Click(object sender, EventArgs e)
        {
            Quit();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            // ожидание сообщения не вызывает зависание программы
            new Send(delegate() { Connected(); }).BeginInvoke(null, null);
        }
        // метод для запуска автоматического приема сообщений
        private void Connected() 
        {
            while (true) 
            {
                SendMessage();
            }
        }
        // обновление информации в текстовом окне
        private void Mess(byte[] buf) 
        {
            richTextBox1.Text += Encoding.Default.GetString(buf);
        }
        // метод для завершения приложения
        private void Quit() 
        {
            socket.Close();
            Application.Exit();
        }
    }
Конечно,реализация не идеальна: необходимо добавить обработчики исключений, какие-то моменты реализовать по-другому...
Но, согласно заданию, данное решение полностью справляется с поставленной задачей. Тестировал через локальный адрес компьютера (127.0.0.1).

PS: Если кто захочет что-либо изменить или чем-либо дополнить, то будет очень интересно взглянуть (для общего развития)
1
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
07.04.2010, 01:26
ето тут использована библиотека Винсокет?

Добавлено через 3 минуты
а еще хотел спросит разьяснит е ка мне мне сказали написать прогу жопутсим клиент сервер в сипользованием Винсокет могу ли я использовать базовые классы в си шарпе? типа сокетс или нет.сокетс? они что эти классы используют чо то я запутался.
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
07.04.2010, 09:19
один вопрос - одна тема + ставьте знаки препинания!
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
07.04.2010, 09:23  [ТС]
Цитата Сообщение от asd321 Посмотреть сообщение
ето тут использована библиотека Винсокет?
Нет, все средствами Visual Studio и платформы NET
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2010, 09:23
Помогаю со студенческими работами здесь

Обмен сообщениями между сокетами
Есть два приложение одно - клиент, второе - сервер. using System; using System.Text; using System.Net; using System.Net.Sockets;...

Обмен сообщениями между приложением и устройством
Приветствую! Обмен сообщениями будет между приложением и устройством(имеет заводской ip). Где нужно использовать ip моего ПК и ip...

Tcp протокол
Есть программа которая состоит из сервера и клиента, отправляет сообщение по tcp протоколу. Но в задании написано разработать прикладной...

Свой протокол поверх TCP
Есть задача. Нужно написать клинт - серверное приложение которое работает на основе специализированного протокола поверх TCP. Есть ТЗ где...

Как происходит получение данных через протокол TCP
Имеется клиент-серверное приложение: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...


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

Или воспользуйтесь поиском по форуму:
6
Закрытая тема Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru