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

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

23.09.2012, 17:30. Просмотров 1256. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 17:30
Ответы с готовыми решениями:

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

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

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

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

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

3
turbanoff
Эксперт Java
4037 / 3772 / 743
Регистрация: 18.05.2010
Сообщений: 9,330
Записей в блоге: 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
24.09.2012, 14:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 14:16

Можно ли использовать User Control, созданный в одном приложении, в другом?
Имеется 2 самостоятельных ASP.NET приложения. Можно ли использовать User Control, созданный в одном...

Форма и консоль в одном клиент-серверном приложении
Пишу клиент-серверное приложени.Хочу сделать чтобы на форме были элементы управления сервером, а в...

Найти ошибку, в приложении клиент-сервер
Здравствуйте! Помогите найти ошибку, в приложении клиент сервер!


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

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

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