Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 19.09.2018
Сообщений: 26

Чат. Нужно чтобы все клиенты видели отправленное сообшение

20.09.2018, 12:15. Показов 1083. Ответов 8

Студворк — интернет-сервис помощи студентам
Просьба помочь.
Я новичок в C#. Хочу создать многопользовательский ЧАТ.
Есть клиент, и сервер. Загвоздка в том что клиент видит сообшение которые только тот же клиент и отправил.
Просьба помочь с кодом, сделать так чтоб все клиенты видели отправление сообшение.

Сервер
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
using SimpleTCP;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
 
 
        SimpleTcpServer server;
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
            server = new SimpleTcpServer();
            server.Delimiter = 0x13;//enter
            server.StringEncoder = Encoding.UTF8;
            server.DataReceived += Server_DataReceived;
            
        }
 
        private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString + Environment.NewLine;
                e.ReplyLine(e.MessageString);
 
            });
 
        }
 
 
        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            btnStop.Enabled = true;
 
            txtStatus.Text += "Server starting..." + Environment.NewLine;
            System.Net.IPAddress ip = System.Net.IPAddress.Parse(txtHost.Text);
            server.Start(ip, Convert.ToInt32(txtPort.Text));
 
        }
 
        private void btnStop_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = true;
            btnStop.Enabled = false;
 
            txtStatus.Text += "Server stoped..." + Environment.NewLine;
 
            if (server.IsStarted)
                server.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
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Data.SqlClient;
using SimpleTCP;
using System.Runtime.InteropServices;
 
namespace WindowsFormsApp1
{
 
 
    public partial class Form2 : Form
    {
 
 
 
        public Form2()
        {
            InitializeComponent();
           
        }
 
 
        private const int HT_CAPTION = 0x2;
        private const int WM_NCLBUTTONDOWN = 0x00A1;
        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern bool ReleaseCapture();
        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern int SendMessage(
    IntPtr hwnd,
    int wMsg,
    int wParam,
    int lParam);
 
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                Rectangle rct = DisplayRectangle;
                if (rct.Contains(e.Location))
                {
                    ReleaseCapture();
                    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
                }
            }
        }
 
 
        SimpleTcpClient client;
                
 
        private void btnConnect_Click(object sender, EventArgs e)
        {
 
            btnConnect.Enabled = false;
            client.Connect(txtHost.Text, Convert.ToInt32(txtPort.Text));
        }
 
 
        private void Form2_Load(object sender, EventArgs e)
        {
            client = new SimpleTcpClient();
            client.StringEncoder = Encoding.UTF8;
            client.DataReceived += Client_DataReceived;
 
        }
 
        
        private void Client_DataReceived(object sender, SimpleTCP.Message e)
        {
 
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString;
            });
        }
 
 
 
 
 
        private void btnSend_Click(object sender, EventArgs e)
        {
            
            String connectString = "Data Source=PROGRAMMER1; Initial Catalog=ChatECB;Integrated Security=SSPI;";
            string query = @"INSERT INTO TEXT_MESSAGE 
                            values (@TXT_MESSAGE); ";
 
 
 
            SqlConnection myConnection = new SqlConnection(connectString);
            SqlCommand command = new SqlCommand(query, myConnection);
            myConnection.Open();
 
            command.Parameters.AddWithValue("TXT_MESSAGE", label1.Text + ":   " + txtMessage.Text);
 
 
            command.ExecuteNonQuery();
            myConnection.Close();
 
 
            client.WriteLineAndGetReply(label1.Text + ":   "+ txtMessage.Text + Environment.NewLine, TimeSpan.FromSeconds(1));
 
            txtMessage.Clear();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 secondForm = new Form1();
            
 
            this.Hide();
            if (secondForm.ShowDialog() != DialogResult.OK)
                this.Close();
        }
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.09.2018, 12:15
Ответы с готовыми решениями:

Нужно чтобы все клиенты, подключенные к COM серверу, получали сообщения.
Работаю на C++ Builder 5. Получается следующая проблема: к COM серверу подключается клиент - события проходят нормально, но если к серверу...

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

Консольный чат Клиенты-Сервер на сокетах
При отправки сообщения клиентом, оно приходит только серверу, а как сделать, чтобы оно приходило еще всем клиентам? Сервер: ...

8
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
20.09.2018, 12:21
Цитата Сообщение от ntrader Посмотреть сообщение
Загвоздка в том что клиент видит сообшение которые только тот же клиент и отправил
так а сервер их видит? Вы вообще как запускаете клиент и сервер? на одной машине, на разных, локальная ли сеть, пытаетесь стучать через роутер?
0
2 / 2 / 0
Регистрация: 19.09.2018
Сообщений: 26
20.09.2018, 12:23  [ТС]
сервер видит клиентов. запускаю на одной машине
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
20.09.2018, 12:29
ntrader, а сообщения от клиентов? какой ip указываете
0
2 / 2 / 0
Регистрация: 19.09.2018
Сообщений: 26
20.09.2018, 12:49  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
ntrader, а сообщения от клиентов? какой ip указываете

IP: 127.0.0.1
PORT: 8910


Клиент получает обратно от сервера отправленое сообшение, но получает сообшение только тот кто отправил

Добавлено через 3 минуты
Цитата Сообщение от Рядовой Посмотреть сообщение
ntrader, а сообщения от клиентов? какой ip указываете

Сервер видит все сообшение
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
20.09.2018, 13:09
ntrader, а где в коде сервер отсылает сообщение всем подключенным клиентам?

Добавлено через 10 минут
если бы вы переписали код без simpletcp вам бы, наверно, много кто помог. А так, я например, не знаю как работать с этой библиотекой
0
2 / 2 / 0
Регистрация: 19.09.2018
Сообщений: 26
20.09.2018, 14:09  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
ntrader, а где в коде сервер отсылает сообщение всем подключенным клиентам?

Нигде не указано что сервер отсылает сообшение всем подключенным клиентом, по этому и написал тут. может кто поможет, так как 3 дня уже пытаюсь разобраться
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
20.09.2018, 14:18
Цитата Сообщение от ntrader Посмотреть сообщение
по этому и написал тут. может кто поможет
все упирается в вашу библу, перепишите код без нее, в .NET для этого есть готовые классы TcpClient и TcpListener
0
2 / 2 / 0
Регистрация: 19.09.2018
Сообщений: 26
24.09.2018, 17:09  [ТС]
Поменял на сервере, теперь сообшения получают все клиенты. Но уже другая проблема, клиент который отправил сообшение, от сервера тоже получает обратно.
Что можно сделать ?


C#
1
2
3
4
5
6
7
8
9
10
11
12
private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                server.Broadcast(txtStatus.Text += e.MessageString + Environment.NewLine);
 
                
                e.ReplyLine(e.MessageString);
            });
 
        }
Добавлено через 57 минут
По мимо того что отправляет сообшение и клиенту который написал сообшение, то сервер отправляет и всю историю переписки с момента запуска сервера.......

Добавлено через 58 минут
Вопрос решил. Кому будет полезно

C#
1
2
3
4
5
6
7
8
9
10
11
12
 private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString + Environment.NewLine;
                
                server.Broadcast(e.MessageString + Environment.NewLine);
 
            });
            
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2018, 17:09
Помогаю со студенческими работами здесь

Что нужно знать, чтобы написать онлайн чат?
Здравствуйте! Что нужно знать, чтобы написать онлайн чат (т.е. клиент серверное приложение для общения между людьми посредством компьютеров...

Как сделать чтобы блоки не видели друг друга?
Написал скрипт, который вставляет блоки разных размеров, цветов и с различными выравниваниями и отступами. Убил 2 дня 400 строк кода на...

Как сделать так, чтобы 2 сервера друг друга видели
всем привет, уважаемые форумчане! ситуация такова: ранее 2 сервера стояли в одном офисе. где-то полгода назад их разнесли по разным...

как настроить чтобы два компа друг друга видели
мне маршутизатор устоновили d-link dir300 , блин ковырялся в сетевом окружении ,пробовал настраивать локалку, короче не могу настроить так...

Как сделать чтобы подсети под управлением NAT видели друг друга?
Добрый день. Есть 3 филиала с ip адресами: 1. 10.105.54.12 2. 10.105.195.1 3. 10.105.233.1 все пингуют друг друга а также пингуются...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru