Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/75: Рейтинг темы: голосов - 75, средняя оценка - 4.75
2088 / 1252 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
1

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

06.04.2010, 00:02. Просмотров 14884. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2010, 00:02
Ответы с готовыми решениями:

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

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

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

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

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
5
4313 / 1481 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.04.2010, 00:41 2
Отличная статья по сокетам, думаю поможет http://www.microsoft.com/Rus/M... nsock.mspx
1
2088 / 1252 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
06.04.2010, 11:25  [ТС] 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
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
Мохаммед Али
131 / 69 / 5
Регистрация: 14.08.2009
Сообщений: 916
07.04.2010, 01:26 4
ето тут использована библиотека Винсокет?

Добавлено через 3 минуты
а еще хотел спросит разьяснит е ка мне мне сказали написать прогу жопутсим клиент сервер в сипользованием Винсокет могу ли я использовать базовые классы в си шарпе? типа сокетс или нет.сокетс? они что эти классы используют чо то я запутался.
0
Комбайнёр
1590 / 688 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
07.04.2010, 09:19 5
один вопрос - одна тема + ставьте знаки препинания!
0
2088 / 1252 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
07.04.2010, 09:23  [ТС] 6
Цитата Сообщение от asd321 Посмотреть сообщение
ето тут использована библиотека Винсокет?
Нет, все средствами Visual Studio и платформы NET
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2010, 09:23

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.