Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/36: Рейтинг темы: голосов - 36, средняя оценка - 4.89
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
.NET 2.x

Многопользовательский чат на TcpClient

09.11.2011, 10:47. Показов 7405. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил написать чат.
сервер:
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1
{
    class Program
    {
 
        
 
        const int port=3128;
        public static List<user> users = new List<user>();
        public static user tmpuser = new user();
 
        public static TcpListener listener;
        public static Thread conn;
 
        static bool doneserver;
 
        public static string host = Dns.GetHostName();
        public static string myIp = Dns.GetHostByName(host).AddressList[0].ToString();
        
        static void Main(string[] args)
        {
            IPAddress localhost = IPAddress.Parse(myIp);
            listener = new TcpListener(localhost, port);
            listener.Start();
 
            Console.WriteLine("Сервер запущен...\r\n");
            
            conn = new Thread(connection);
            conn.Start();
        }
 
        static string ReadMessage(TcpClient client)
        {
            byte[] buffer = new byte[256];
            int totalRead = 0;
            do
            {
                int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
                totalRead += read;
            } while (client.GetStream().DataAvailable);
            return Encoding.Unicode.GetString(buffer, 0, totalRead);
        }
 
        public static void connection()
        {
            doneserver = false;
            Thread thread;
            while (!doneserver)
            {
                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine("Клиент подключен. IP:{0}",client.Client.RemoteEndPoint.ToString());
                thread = new Thread(new ParameterizedThreadStart(HandledientThread));
                thread.Start(client);
                
            }
        }
 
        static void HandledientThread(object obj)
        {
            TcpClient clientid = obj as TcpClient;
            bool done = false;
 
            while (!done)
            {
                string message = ReadMessage(clientid);
 
                string flag = "";
                string mess = "";
 
                flag += message[0];
                //////////////если прислал сообщение////////
                if (flag == "m")
                {
                    Console.WriteLine("log::m::{0}",message);
 
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    Console.WriteLine(mess);
                    SendMessageAll(clientid, mess, "m");
                }
                //////////////если прислал ник///////////////
                if (flag == "n")
                {
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    tmpuser.add(mess, clientid);
                    users.Add(tmpuser);
 
                    SendMessageAll(clientid, mess, "a");
                    mess = "";
 
                    Console.WriteLine("//////////////////////////////////////");
 
                    foreach (user tmp in users)
                    {
                        Console.Write("name:{0}",tmp.name);
                        Console.WriteLine("klient:{0}", tmp.klient.Client.RemoteEndPoint.ToString());
                       
                        if(clientid!=tmp.klient)
                            mess += tmp.name + ";";
                    }
 
                    Console.WriteLine("///////////////////////////////////////");
                    Console.Write("log:::n:::{0}", mess);
 
                    SendMessage(clientid, mess, "l");
                }
                ///////////////если отключился/////////////
                if (flag == "o")
                {
                    Console.WriteLine("log::o::{0}", message);
 
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
                    SendMessageAll(clientid,mess, "z");
                    user tmp2 = new user();
                    foreach (user tmp in users)
                    {
                        if (tmp.klient == clientid)
                        {
                            tmp2.add(tmp.name, tmp.klient);
                        }
                    }
                    users.Remove(tmp2);
                    done = true;
                }
 
            }
            Console.WriteLine("Клиент отключен. IP:{0}",clientid.Client.RemoteEndPoint);
            
            clientid.Close();
        }
 
 
 
        static void SendMessage(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }
 
        static void SendMessageAll(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            foreach (user tmp in users)
            {
                if (tmp.klient!=client)
                    tmp.klient.GetStream().Write(bytes, 0, bytes.Length);
            }
        }
    }
 
    public class user
    {
        public int id;
        public string name;
        public TcpClient klient;
 
        public void add(int aid, string aname, TcpClient aklient)
        {
            id = aid;
            name = aname;
            klient = aklient;
        }
    }
}
Клиент:
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace Внутреняя_ICQ_Клиент_
{
    public partial class Form1 : Form
    {
 
        IPAddress ipserver;
        int port;
        TcpClient clientkl;
        Thread read;
        public string NIK;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void пользователиВСетиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                NIK = textBox1.Text;
                ipserver=IPAddress.Parse(textBox2.Text.ToString());
                port=Convert.ToInt32(textBox5.Text);
                if (пользователиВСетиToolStripMenuItem.Text == "Подключиться")
                {
 
                    пользователиВСетиToolStripMenuItem.Text = "Отключиться";
                    ///////вкладки///////////////
                    panelmessage.Visible = true;
                    panellogin.Visible = false;
                    panelconfig.Visible=false;
                    /////////////////////////////
                    try
                    {
                        clientkl = new TcpClient();
                        clientkl.Connect(ipserver, port);
 
                        SendMessage(clientkl, NIK, "n");
                    
                        read = new Thread(new ParameterizedThreadStart(Read));
                        read.Start(clientkl);
                    }
                    catch
                    {
                        MessageBox.Show("[X] Сервер не доступен!");
                        пользователиВСетиToolStripMenuItem.Text = "Подключиться";
                        ///////вкладки///////////////
                        panelmessage.Visible = false;
                        panellogin.Visible = true;
                        panelconfig.Visible = false;
                        /////////////////////////////
 
                        //read.Abort();
                        clientkl.Close();
 
                    }
                }
                else
                {
                    ///////вкладки///////////////
                    panelmessage.Visible = false;
                    panellogin.Visible = true;
                    panelconfig.Visible=false;
                    /////////////////////////////
 
                    пользователиВСетиToolStripMenuItem.Text = "Подключиться";
                    SendMessage(clientkl, NIK, "o");
                    
                }
            }
            else
            {
                ///////вкладки///////////////
                panelmessage.Visible = false;
                panellogin.Visible = true;
                panelconfig.Visible = false;
                /////////////////////////////
                MessageBox.Show("Введите НИК");
                textBox1.Focus();
            }
        }
 
        private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ///////вкладки///////////////
            panelmessage.Visible = false;
            panellogin.Visible = false;
            panelconfig.Visible = true;
            /////////////////////////////
        }
 
       
        private static void SendMessage(TcpClient client, string message, string flag) 
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }
 
        public void Read(object obj)
        {
            TcpClient client = obj as TcpClient;
            bool done = false;
            while (!done)
            {
                try
                {
                    string message = ReadResponse(client);
 
                    string flag = "";
                    string mess = "";
 
                    flag += message[0];
                    //////////////если сообщение/////////////
                    if (flag == "m")
                    {
 
                        richTextBox1.Text += "log: " + message + "\r\n";
 
                        for (int i = 1; i < message.Length; i++)
                        {
                            mess += message[i];
                        }
                        richTextBox1.Text += mess + "\r\n";
                    }
                    ///////////////если список/////////////
                    if (flag == "l")
                    {
 
                        richTextBox1.Text += "log: " + message + "\r\n";
 
                        for (int i = 1; i < message.Length; i++)
                        {
                            if (message[i] != ';')
                            {
                                mess += message[i];
                            }
                            else
                            {
                                listBox1.Items.Add(mess);
                                mess = "";
                            }
                        }
                    }
                    //////////////////если ушел кто-то////////////
                    if (flag == "z")
                    {
 
                        richTextBox1.Text += "log: " + message + "\r\n";
 
                        for (int i = 1; i < message.Length; i++)
                        {
                            mess += message[i];
                        }
                        listBox1.Items.Remove(mess);
                    }
                    ///////////////////если пришел кто-то////////////////
                    if (flag == "a")
                    {
 
                        richTextBox1.Text += "log: " + message + "\r\n";
 
                        for (int i = 1; i < message.Length; i++)
                        {
                            mess += message[i];
                        }
                        listBox1.Items.Add(mess);
                    }
 
                }
                catch
                {
                   
                }
            }
            client.Close();
 
        }
 
        private static string ReadResponse(TcpClient clientkl) 
        { 
            byte[] buffer = new byte[256]; 
            int totalRead = 0;
            do 
            { 
                int read = clientkl.GetStream().Read(buffer, totalRead, buffer.Length - totalRead); 
                totalRead += read; 
 
            }
            while (clientkl.GetStream() .DataAvailable) ; 
            return Encoding.Unicode.GetString(buffer, 0, totalRead); 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string message = textBox3.Text;
            SendMessage(clientkl,message,"m");
            richTextBox1.Text += DateTime.Now.ToLongTimeString() + " " + NIK + ": " + message + "\r\n";
            textBox3.Text = "";
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
    }
}
Проблема в том что при подключении нового клиента в списке users все перезаписывается им((((
Вложения
Тип файла: rar Console server chat.rar (49.4 Кб, 166 просмотров)
Тип файла: rar Внутреняя ICQ(Клиент).rar (59.3 Кб, 185 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2011, 10:47
Ответы с готовыми решениями:

Многопользовательский голосовой чат
Здравствуйте, нужна помощь в написании многопользовательского голосового чата. Я создал сервер на С++, и чат на С#. Сейчас у меня...

Многопользовательский чат с неограниченным количеством клиентов
я сделал чат, Клиент-сервер, но мне нужно сделать чтобы клиентов было неограничено? вроде что-то &quot;сокет.BeginRecive&quot;... но я с...

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

9
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
09.11.2011, 12:45  [ТС]
опишу поподробнее. сервер запускается и ждет подключение клиента. когда клиент подключается то он переходит в поток wordclient. здесь сервер считывает сообщение от клиента и по первой букве в сообщении понимает тип полученного сообщения. "n" - это ник. когда сервер получает ник он должен добавить клиента в список users, и в ответ отправить ему список клиентов онлайн, а так же всем клиентам которые онлайн разослать сообщение, с первой буквой "а", о том что добавился новый клиент.

Вся проблема в том что при добавлении нового клиента список почему-то перезатирается последним подключившимся клиентом.

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1
{
    class Program
    {
 
        
 
        const int port=3128;
        public static List<user> users = new List<user>();
        public static user tmpuser = new user();
 
        public static TcpListener listener;
        
        public static string host = Dns.GetHostName();
        public static string myIp = Dns.GetHostByName(host).AddressList[0].ToString();
        
        static void Main(string[] args)
        {
            IPAddress localhost = IPAddress.Parse(myIp);
            listener = new TcpListener(localhost, port);
            listener.Start();
            Console.WriteLine("Сервер запущен...");
 
            TcpClient client;
            Thread thread;
 
            while (true)
            {
                while (!listener.Pending())
                {
                    Thread.Sleep(500);
                }
                client = listener.AcceptTcpClient();
                Console.WriteLine("Клиент подключен. IP:{0}", client.Client.RemoteEndPoint.ToString());
                thread = new Thread(new ParameterizedThreadStart(wordclient));
                thread.Start(client);
            }
        }
 
        static void wordclient(object obj)
        {
            TcpClient clientid = obj as TcpClient;
            bool done = true;
 
            while (done)
            {
                string message = ReadMessage(clientid);
 
                string flag = "";
                string mess = "";
 
                flag += message[0];
                //////////////если прислал сообщение////////
                if (flag == "m")
                {
                    Console.WriteLine("log::m::{0}",message);
 
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    Console.WriteLine(mess);
                    SendMessageAll(clientid, mess, "m");
                }
                //////////////если прислал ник///////////////
                if (flag == "n")
                {
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    tmpuser.add(mess, clientid);
                    users.Add(tmpuser);
 
                    SendMessageAll(clientid, mess, "a");
                    mess = "";
 
                    Console.WriteLine("//////////////////////////////////////");
 
                    foreach (user tmp in users)
                    {
                        Console.Write("name:{0}",tmp.name);
                        Console.WriteLine("klient:{0}", tmp.klient.Client.RemoteEndPoint.ToString());
                       
                        if(clientid!=tmp.klient)
                            mess += tmp.name + ";";
                    }
 
                    Console.WriteLine("///////////////////////////////////////");
                    Console.Write("log:::n:::{0}", mess);
 
                    SendMessage(clientid, mess, "l");
                }
                ///////////////если отключился/////////////
                if (flag == "o")
                {
                    Console.WriteLine("log::o::{0}", message);
 
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
                    SendMessageAll(clientid,mess, "z");
                    user tmp2 = new user();
                    foreach (user tmp in users)
                    {
                        if (tmp.klient == clientid)
                        {
                            tmp2.add(tmp.name, tmp.klient);
                        }
                    }
                    users.Remove(tmp2);
                    done = false;
                }
 
            }
            Console.WriteLine("Клиент отключен. IP:{0}",clientid.Client.RemoteEndPoint);
            
            clientid.Close();
        }
 
        static string ReadMessage(TcpClient client)
        {
            byte[] buffer = new byte[256];
            int totalRead = 0;
            do
            {
                int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
                totalRead += read;
            } while (client.GetStream().DataAvailable);
            return Encoding.Unicode.GetString(buffer, 0, totalRead);
        }
 
        static void SendMessage(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }
 
        static void SendMessageAll(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            foreach (user tmp in users)
            {
                if (tmp.klient!=client)
                    tmp.klient.GetStream().Write(bytes, 0, bytes.Length);
            }
        }
    }
 
    public class user
    {
        public string name;
        public TcpClient klient;
 
        public void add(string aname, TcpClient aklient)
        {
            name = aname;
            klient = aklient;
        }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2011, 13:15
Так вы каждый раз добавляете в список ссылку на один и тот же объект. В результате в списке несколько ссылок, но они все указывают на одно и то же место в памяти.
Клиент залогинился, вы перезаписали данные объекта, вот все остальные ссылки и отображают изменения.

А вообще простите за прямоту, но код сервера ужасен. Руки чешутся отрефакторить почти каждую строчку.
1
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
09.11.2011, 15:43  [ТС]
новичек я(((
буду рад если поможите)))

Добавлено через 10 минут
я так понял надо сделать tcpclient[] client???

Добавлено через 6 минут
просто не пойму как сделать((((((((((((

Добавлено через 1 час 56 минут
помогите сделать чтобы не перезатиралось, просто я понятия не имею как....
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2011, 16:23
Цитата Сообщение от Массаракш Посмотреть сообщение
новичек я(((
А, ну это пройдет.

Уберите статическое поле tempclient и при подключении пользователя каждый раз создавайте новый объект.
1
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
09.11.2011, 16:43  [ТС]
а можете пояснить что именно косячного в сервере? наверное принципиально не так пишу??

Добавлено через 3 минуты
когда убираю статик кричит: Ошибка 2 Для нестатического поля, метода или свойства "ConsoleApplication1.Program.tmpuser " требуется ссылка на объект C:\Users\U418_2\Desktop\Console server chat\Console server chat\Program.cs 84 21 Console server chat
а как эту ссылку сделать незнаю((((((
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2011, 17:31
Цитата Сообщение от Массаракш Посмотреть сообщение
что именно косячного в сервере?
Что особо резануло глаза в коде сервера (на код клиента не смотрел):
Именование переменных и типов.
Создание потоков для клиентов.
Синхронизация (вернее, ее отсутствие) между потоками.
Построение строки в цикле через +=
Чтение юникода из потока без учета размера char
Сам протокол общения (удачи поболтать на английском)
Полное отсутствие обработки исключений (напр. весь сервер закрашится, если отрубит хотя бы одного клиента).

Оно понятно, что на данном этапе код пишется по методу "чтоб запускалось" и со временем будет обрастать всем нужным.

Цитата Сообщение от Массаракш Посмотреть сообщение
когда убираю статик кричит
Убирайте не только модификатор static, а удалите полностью переменную tempclient.
Вместо статического поля создавайте ее каждый раз заново при подключении нового клиента.

Цитата Сообщение от Массаракш Посмотреть сообщение
наверное принципиально не так пишу??
Для начинающего - нормально, понимание определенных процессов придет со временем.
А вот по поводу протокола я бы задумался - не понятно как общаться, используя латиницу.
1
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
09.11.2011, 18:23  [ТС]
под tempclient вы имеете ввиду tmpuser?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2011, 18:33
Ага, его самого.

На 85-й строчке перед строкой
C#
1
tmpuser.add(mess, clientid);
добавьте
C#
1
var tmpuser = new user();
А строчку 21
C#
1
public static user tmpuser = new user();
удалите совсем.
1
10 / 10 / 3
Регистрация: 09.11.2011
Сообщений: 73
14.11.2011, 17:03  [ТС]
Все работает. клиентов добавляет. спасибо!!!
Но теперь проблема в другом((((
сервер имеет теперь такой код
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1
{
    class Program
    {
 
        
 
        const int port=3128;
        static public List<user> users = new List<user>();
        
        public static TcpListener listener;
        
        public static string host = Dns.GetHostName();
        public static string myIp = Dns.GetHostByName(host).AddressList[0].ToString();
        
        static void Main(string[] args)
        {
            IPAddress localhost = IPAddress.Parse(myIp);
            listener = new TcpListener(localhost, port);
            listener.Start();
            Console.WriteLine("Сервер запущен...");
 
            
            Thread thread;
            
 
            while (true)
            {
                while (!listener.Pending())
                {
                    Thread.Sleep(500);
                }
 
                TcpClient client = new TcpClient();
                client =listener.AcceptTcpClient();
                thread = new Thread(new ParameterizedThreadStart(wordclient));
                thread.Start(client);
            }
        }
 
        static void wordclient(object obj)
        {
            TcpClient clientid = obj as TcpClient;
            bool done = true;
 
            while (done)
            {
                string message = ReadMessage(clientid);
 
                string flag = "";
                string mess = "";
 
                flag += message[0];
                //////////////если прислал сообщение////////
                if (flag == "m")
                {
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    //Console.WriteLine(mess);
                    SendMessageAll(clientid, mess, "m");
                }
                //////////////если прислал ник///////////////
                if (flag == "n")
                {
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
 
                    var tmpuser = new user();
 
                    tmpuser.add(mess, clientid);
                    users.Add(tmpuser);
 
                    SendMessageAll(clientid, mess, "a");
                    mess = "";
                    
                    foreach (user tmp in users)
                    {
                        Console.WriteLine("Клиент подключен. IP:{0}   Ник:{1}", clientid.Client.RemoteEndPoint.ToString(), tmp.name);
                        if(clientid!=tmp.klient)
                            mess += tmp.name + ";";
                    }
 
                    SendMessage(clientid, mess, "l");
                }
                ///////////////если отключился/////////////
                if (flag == "o")
                {
                    for (int i = 1; i < message.Length; i++)
                    {
                        mess += message[i];
                    }
                    SendMessageAll(clientid, mess, "z");
                    Console.WriteLine("Клиент отключен. IP:{0}    Ник:{1}", clientid.Client.RemoteEndPoint, mess);
                    user tmp2 = new user();
                    foreach (user tmp in users)
                    {
                        if (tmp.klient == clientid)
                        {
                            tmp2.add(tmp.name, tmp.klient);
                        }
                    }
                    users.Remove(tmp2);
 
                    done = false;
                }
            }
            
            clientid.Close();
        }
 
        static string ReadMessage(TcpClient client)
        {
            byte[] buffer = new byte[256];
            int totalRead = 0;
            do
            {
                int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
                totalRead += read;
            } while (client.GetStream().DataAvailable);
            return Encoding.Unicode.GetString(buffer, 0, totalRead);
        }
 
        static void SendMessage(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            client.GetStream().Write(bytes, 0, bytes.Length);
        }
 
        static void SendMessageAll(TcpClient client, string message, string flag)
        {
            flag += message;
            byte[] bytes = Encoding.Unicode.GetBytes(flag);
            foreach (user tmp in users)
            {
                if (tmp.klient!=client)
                    tmp.klient.GetStream().Write(bytes, 0, bytes.Length);
            }
        }
    }
 
    public class user
    {
        public string name;
        public TcpClient klient;
 
        public void add(string aname, TcpClient aklient)
        {
            name = aname;
            klient = aklient;
        }
    }
}
Добавлено через 1 минуту
Теперь при отключении клиента и повторном его включении кричит на 153 строку. кричит что типа объект удален.
SendMessageAll вызывается со строки 108
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2011, 17:03
Помогаю со студенческими работами здесь

Многопользовательский чат по WebSocket
Здравствуйте, ищу пример серверного (SuperWebSocket) и пользовательского (WebSocket4Net) ПЗ, которые обеспечивают прототип...

Нужно написать многопользовательский чат для сети
Помогите написать многопользовательский чат для сети ! Может есть у кого подобный исходник ... Надо написать программу к которой...

Многопользовательский чат на socket. Не обновляется список пользователей
пишу многопользовательский чат на socket (уже написал с wcf и он работает). сообщения обмениваются но список клиентов обновляется только у...

Как создать многопользовательский чат (Сервер-клиент)
Как создать многопользовательский чат(Сервер-клиент)?

c# многопользовательский чат с отдельным сервером. не могу понять в чем дело
В общем в чем проблема, клиенты присоединяются к серверу, спокойно отправляют сообщения, и в 1 прекрасный момент один из клиентов теряет...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru