Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
unknown
2 / 2 / 0
Регистрация: 23.09.2012
Сообщений: 27
1

Можно ли реализовать сервер и клиент в одном приложении

23.09.2012, 17:30. Просмотров 1116. Ответов 3
Метки нет (Все метки)

Вот пишу программу, обмена сообщениями между 2 приложениями. Хочу сделать что бы каждое приложение было как клиент и сервер. Немножко не получается. Написал пока клиента и сервера.
клиент
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace mTcpClient
{
    public partial class Form1 : Form
    {
        private delegate void Send();
        TcpListener server = null;
        TcpClient newClient = new TcpClient();
        IPAddress ipAddrClient;
        NetworkStream tcpStream;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                label1.Text = "Соединение с сервером устанавливается. . .";
                Int32 port = 8080;
                ipAddrClient = IPAddress.Parse("192.168.1.102");
                newClient.Connect(ipAddrClient, port);
                tcpStream = newClient.GetStream();
                new Send(delegate() { SendMessege(); }).BeginInvoke(null, null);
            }
            catch (SocketException se)
            {
                /*try
                {
                    newClient.Close();
                    label1.Text = "Соединение с клиентом устанавливается. . .";
                    IPAddress ipAddrServer = IPAddress.Any;
                    server = new TcpListener(ipAddrServer, 8080);
                    server.Start();
                    Byte[] bytes = new Byte[256];
                    String data = null;
                    TcpClient client = server.AcceptTcpClient();
                    label1.Text = "Соединение с клиентом установлено!";
                }
                catch (SocketException se) { MessageBox.Show("Exception:\n" + se); }*/
                newClient.Close();
                MessageBox.Show("Exception:\n" + se);
                Application.Exit();
            }
            label1.Text = "Соединение с сервером установлено!";
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] buffer = Encoding.ASCII.GetBytes(textBox1.Text);
                tcpStream.Write(buffer, 0, buffer.Length);
                richTextBox1.Text += textBox1.Text + " \n";
                textBox1.Text = "";
            }
            catch(InvalidOperationException io)
            {
                MessageBox.Show("Exception:\n" + io);
                Application.Exit();
            }
 
        }
 
        private void SendMessege()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[newClient.ReceiveBufferSize];
                    int bytesRead = tcpStream.Read(buffer, 0, newClient.ReceiveBufferSize);
                    richTextBox1.Text += Encoding.ASCII.GetString(buffer);
                    richTextBox1.Text += "\n";
                }
                catch
                {
                    tcpStream.Close();
                    newClient.Close();
                    //server.Stop();
                    Application.Exit();
                }
            }
        }
    }
}

сервер
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace mTcpServer
{
    public partial class Form1 : Form
    {
        private delegate void Send();
        TcpListener server = null;
        TcpClient newClient = new TcpClient();
        NetworkStream tcpStream;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            /*try
            {
                Int32 port = 8080;
                IPAddress ipAddrClient = IPAddress.Parse("192.168.1.101");
                newClient.Connect(ipAddrClient, port);
            }
            catch
            {*/
            //try
            //{
            label1.Text = "Соединение с клиентом устанавливается. . .";
            IPAddress ipAddrServer = IPAddress.Any;
            server = new TcpListener(ipAddrServer, 8080);
            server.Start();
            Byte[] bytes = new Byte[256];
            String data = null;
            newClient = server.AcceptTcpClient();
            label1.Text = "Соединение с клиентом установлено!";
            tcpStream = newClient.GetStream();
            new Send(delegate() { SendMessege(); }).BeginInvoke(null, null);
            /*try
            {
                byte[] buffer = new byte[newClient.ReceiveBufferSize];
                int bytesRead = tcpStream.Read(buffer, 0, newClient.ReceiveBufferSize);
                richTextBox1.Text += Encoding.ASCII.GetString(buffer) + " \n";
                textBox1.Text = "";
            }
            catch (InvalidOperationException io)
            {
                MessageBox.Show("Exception:\n" + io);
                Application.Exit();
            }*/
            /*}
            catch (SocketException se) 
            {
                server.Stop();
                newClient.Close();
                MessageBox.Show("Exception:\n" + se);
                Application.Exit();
            }  */          
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] buffer = Encoding.ASCII.GetBytes(textBox1.Text);
                tcpStream.Write(buffer, 0, buffer.Length);
                richTextBox1.Text += textBox1.Text + " \n";
                textBox1.Text = "";
            }
            catch (InvalidOperationException io)
            {
                MessageBox.Show("Exception:\n" + io);
                Application.Exit();
            }
        }
 
        private void SendMessege()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[newClient.ReceiveBufferSize];
                    int bytesRead = tcpStream.Read(buffer, 0, newClient.ReceiveBufferSize);
                    richTextBox1.Text += Encoding.ASCII.GetString(buffer);
                    richTextBox1.Text += "\n";
                }
                catch
                {
                    tcpStream.Close();
                    newClient.Close();
                    //server.Stop();
                    Application.Exit();
                }
            }
        }
    }
}


Но вот у клиента в этой функции вылазит ошибка:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void SendMessege()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[newClient.ReceiveBufferSize];
                    int bytesRead = tcpStream.Read(buffer, 0, newClient.ReceiveBufferSize);
                    richTextBox1.Text += Encoding.ASCII.GetString(buffer);   // ругается на  richTextBox1 
                    richTextBox1.Text += "\n";        //что вызывается в другом потоке
                }
                catch
                {
                    tcpStream.Close();
                    newClient.Close();
                    //server.Stop();
                    Application.Exit();
                }
            }

Никак не могу ее исправить. Помогите. И хочу сделать так что бы каждая программа была и клиентом и сервером. То что пробовал в этом смысле комментировано.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 17:30
Ответы с готовыми решениями:

Как реализовать работу клиент-сервера в одном потоке
Привет всем. Пишу вам всем с просьбой помочь. Есть задание на создание клиент...

Клиент-Сервер: как реализовать
Во общем есть Сервер на Ansi-C Задача:нужно написать клиента C# Данные...

Реализовать взаимодействие клиент-сервер с использованием задач (Task)
Реализовать ситуацию взаимодействия по типу клиент-сервер с использованием...

Клиент-сервер. Как в многопользовательском чате реализовать личные сообщения
Console.WriteLine(Func.ToDateTime() + "Server started."); ...

Клиент-сервер. Можно ли организовать реализацию как на WarcraftIII
Добрый день. Сейчас занимаюсь крупным проектом и обходился всегда без этого....

3
turbanoff
Эксперт Java
4020 / 3755 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
24.09.2012, 09:47 2
Вот здесь - вопрос номер 3. Ответы на 7 самых частых вопросов по WinForms
1
unknown
2 / 2 / 0
Регистрация: 23.09.2012
Сообщений: 27
24.09.2012, 14:13  [ТС] 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
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace mTcpClient
{
    public partial class Form1 : Form
    {
        //делегат для непрерывного получения сообщений
        private delegate void Send();
        TcpListener server = null;
        TcpClient newClient = new TcpClient();
        IPAddress ipAddrClient;
        NetworkStream tcpStream;
 
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        //Устанавливаем соединение с сервером
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                ConnectToServer();
            }
            catch (SocketException se)
            {
                newClient.Close();
                tcpStream.Close();
                MessageBox.Show("Exception:\n" + se);
            }
            label1.Text = "Соединение с сервером установлено!";
        }
        //Отправляем сообщение 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                SendMessage();
            }
            catch (InvalidOperationException io)
            {
                MessageBox.Show("Exception:\n" + io);
                Application.Exit();
            }
        }
        //Устанавливаем соединение с клиентом
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                ConnectToClient();
            }
            catch (SocketException se)
            {
                CloseAllThreads();
                MessageBox.Show("Exception: Ошибка\n" + se);
            }
        }
        //Отключаемся от всего (закрываем все потоки)
        private void button4_Click(object sender, EventArgs e)
        {
            CloseAllThreads();
        }
        //Выход из программы
        private void button5_Click(object sender, EventArgs e)
        {
            //CloseAllThreads();
            Application.Exit();
        }
        //Функция получаем сообщения
        private void ReceiveMessege()
        {
            try
            {
                byte[] buffer = new byte[newClient.ReceiveBufferSize];
                int bytesRead = tcpStream.Read(buffer, 0, newClient.ReceiveBufferSize);
                if (bytesRead != 0)
                {
                    //((IPEndPoint)newClient.Client.LocalEndPoint).Address.ToString();
                    richTextBox2.Text += Encoding.ASCII.GetString(buffer);
                    richTextBox2.Text += "\n";
                }
                else 
                {
                    //newClient.Client.Shutdown();
                    label1.Text = "Соединение с клиентом разорвано. . ."; 
                }
                
            }
            catch
            {
                CloseAllThreads();
            }
        }
        //Функция отправки сообщения
        private void SendMessage()
        {
            byte[] buffer = Encoding.ASCII.GetBytes(textBox1.Text);
            tcpStream.Write(buffer, 0, buffer.Length);
            richTextBox2.Text += textBox1.Text + " \n";
            textBox1.Text = "";
        }
 
        private void CloseAllThreads()
        {
            tcpStream.Close();
            newClient.Close();
            //server.Stop();
        }
        //Соединяемся с сервером
        private void ConnectToServer()
        {
            label1.Text = "Соединение с сервером устанавливается. . .";
            Int32 port = 8080;
            ipAddrClient = IPAddress.Parse("192.168.1.102");
            newClient.Connect(ipAddrClient, port);
            tcpStream = newClient.GetStream();
            new Send(delegate() { while (true) ReceiveMessege(); }).BeginInvoke(null, null);
        }
        //Соединяемся с клиентом
        private void ConnectToClient()
        {
            label1.Text = "Соединение с клиентом устанавливается. . .";
            IPAddress ipAddrServer = IPAddress.Any;
            server = new TcpListener(ipAddrServer, 8080);
            server.Start();
            newClient = server.AcceptTcpClient();
            tcpStream = newClient.GetStream();
            label1.Text = "Соединение с клиентом установлено!";
            new Send(delegate() { while (true) ReceiveMessege(); }).BeginInvoke(null, null);
        }
    }
}

Теперь мне интересен вопрос: Как сделать, что бы сервер мог принимать больше одного клиента? Может кто подсказать или так же ссылку дать))
0
LostCoast
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
24.09.2012, 14:16 4
unknown, В методе Listen() указывать число подключений, и с этим условием создавать нужное количество потоков. Каждый поток будет обрабатываться своего клиента.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 14:16

Какое научное исследование можно "внедрить" в простой клиент-сервер
Добрый день! Пишу сюда потому что не знаю где еще это можно делать на этом...

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

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос:...


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

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

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