Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437

Управление через WEB

24.03.2019, 00:03. Показов 3897. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех! на данный момент пишу очень большой проект и сейчас очень нужна ваша помощь если кто-нибудь сможет помочь с дальнейшим вопросом помогите с небольшим примером.
1) Нужно организовать управление C# приложение через WEB желательно Firefox (выглядеть управление должно примерно так) есть 4 кнопки на сервере (Поиск), (Файлы.txt),(Чат),(Менеджер файлов) если я нажму на кнопку поиск тогда на стороне клиента откроется окно поиска из программы и тогда клиент полноценно сможет искать уже через это окно то, что ему нужно.
Так же и с менеджером файлов, только тут уже со стороны сервера должны происходить действия к примеру если я нажал на кнопку (менеджер файлов) у сервера открывается окно на выбор файла загружается либо на хостинг, либо сразу же на сторону клиента(Если возможно).
2) В этой же программе нужно добавить обновление файлов, без лишних файлов таких как Verion.ini и т.д, чтобы при запуске программы она проверила файлы и если есть обновление она их скачивала.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2019, 00:03
Ответы с готовыми решениями:

Управление приложением через VBA
Здравствуйте! Имеется приложение на C#, VS2010. Существует ли способ добавить в него поддержку VBA, чтобы при помощи макросов управлять...

Управление устройством через USB
Как мне управлять вот такой вот вещью через usb из своей проги? Вот исходник на Borland C++

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

65
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
28.03.2019, 15:07
Студворк — интернет-сервис помощи студентам
pafka1997, а ничего что udp пакеты могут теряться?
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
28.03.2019, 15:15
Usaga, вы меня не так поняли. Сайт - панель управления. Все данные будут храниться в бд с которой будет работать бекенд. Фронт планирую сделать ангуляром. Бек на .net core с webApi . А управлять надо приложениями, которые расположены на разных серверах под виндовс, написаны на C# .net framework. Вот этих приложений будет много, у них у каждого графический интерфейс уже есть, но т.к они в разных местах делать одно и тоже неудобно на каждой машине. Заказчик попросил сделать единый пункт управления для всех копий. Вопрос в том, какой технологией пользоваться для общения бекенда с этими самыми программами. Желателен моментальный отклик программ на изменение параметров через сайт

Добавлено через 1 минуту
nicolas2008, он такое еще не проходил) Сейчас кажется что могут теряться, но не потеряются)) Как только столкнется с этим снова напишет сюда)
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
28.03.2019, 15:28  [ТС]
MakcPletnev, Это называется ботнет. И тут не стоит говорить о нем т.к накажут

Добавлено через 2 минуты
nicolas2008, а ведь точно, ну значит TCP & Webapi

Добавлено через 24 секунды
MakcPletnev, А если не прав тогда извини тема очень похожа на бота.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
28.03.2019, 20:02
pafka1997, уверяю, это не ботнет) то, что вы хотите тоже можно назвать ботнетом, разница лишь в функционале
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
28.03.2019, 23:00
Цитата Сообщение от pafka1997 Посмотреть сообщение
А пример приведен из старого проекта.
А потом "почему вы такие злые?", а как будешь добрым, когда тебе показыват левый кусок кода, и просят запустить его. Куда? В космос? На Марс?

Цитата Сообщение от pafka1997 Посмотреть сообщение
У меня в udp уже есть проект в котором реализована передача файлов клиенту
Цитата Сообщение от pafka1997 Посмотреть сообщение
через WEB желательно Firefox
Вам не кажется, что одно с други не вяжется? Все равно что я спрошу какие акамуляторы мне закупить для автомобиля, а потом окажется что я собираю поезд. Ну а чего, оба же на колесах ездят!

Цитата Сообщение от pafka1997 Посмотреть сообщение
Да, не знаю мне у него простота понравилась, ну можно взять TCP & WebAPI, а такие как Http и т.д там путаница идет непонятная.
Хотите открою страшную тайну? Тока тс-с-с-с, никому... http в качестве транспортного протокола использует TCP. Более того, тот же SOAP уже строится поверх http. И знаете к чему весь этот зоопарк? Т.к. каждый протокол решает, мать его, конкретно свою задачу. Нужен сайт? привет http. Нужен максимально быстрая передача на установленом соединении? TCP. Реалтайм критичный к отклику, но не критичный к потерям пакетов? UPD. Удаленые сервис/методы? SOAP. Нужна кросплатформеность? SignalR.

А теперь внимание вопрос: какого я дважды переспрашивал про ТЗ, которое нифига не потяно до сих пор? Может потому что дабы направить вас на верный путь, нужно сначала понимать куда вы хотите попасть?

Цитата Сообщение от pafka1997 Посмотреть сообщение
Это называется ботнет. И тут не стоит говорить о нем т.к накажут
На бота пока смахиваете только вы. asp.net + angular -- типичный набор для любого web-проекта, где вы там углядели ботов -- одной Хоро известно.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.03.2019, 12:41  [ТС]
Wolfdp,
Во-первых я не злой, а был недовольный.
Во-вторых не нужно выдергивать контекст из текста когда люди уже переходят с одного решения на другой.
В третьих, я не буду объяснять каждому, что мы перешли на другое решение если это кому-то стало не понятно и т.д. Просто не вникайте.

А если у вас чуть-чуть пригорает прошу покиньте тему или вообще не пишите если вас, что-то либо раздражает.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2019, 14:58

Не по теме:

Цитата Сообщение от pafka1997 Посмотреть сообщение
Во-первых я не злой, а был недовольный.
Читайте внимательней, кто злой и почему.



Цитата Сообщение от pafka1997 Посмотреть сообщение
я не буду объяснять каждому, что мы перешли на другое решение
лол, и где єто вы указали? ) Стартовали с web, перешли на upd. Я так понимаю по
Цитата Сообщение от pafka1997 Посмотреть сообщение
ну значит TCP & Webapi
нужно собразить, что у вас теперь юзается "гибрид", причем нужно угадать как.

Озвучте полное ТЗ. Серьезно, вам сразу дадут найболее подходящее решение, без гаданий. Не вдавайтесь в названия команды что будут отправлятся и по каким кнопкам вызываются, распишите какие действия они выполняют с точки зрения пользователя (например -- мне нужно реализовать команду поиска файла по имени на всех 5 машинах, команду удаления выбраного файла, команду загрузки файла на выбраную машину). Какие машины у вас стоят и где (это локальная сеть, глобальна, они за NAT). Конкретно от машин и их видимости зависит как между ними лучше всего организовывать связь:
- если они в одной локали и под одним AD, можно тупо расшарить для нужно пользователя директории и не парится.
- не локально, но есть прямая видимость? подымите на машинах WCF который будет иметь нужные команды для выполнения над файлами (или с чем вы там работаете)
- все за NAT (т.е. с одной машины нельзя пингануть вторую)? Окей, пусть общий сервис ожидает кластер на подключение по TCP.

В любом случае вам нужен "центральный" сервис, который будет рулить всеми машинами, и ожидать запросы от обычных "человеческих" пользователей.

Не по теме:

Цитата Сообщение от pafka1997 Посмотреть сообщение
прошу покиньте тему
Вы на форуме, а не в личном блоге. Более того я пишу по теме.

0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.03.2019, 15:47  [ТС]
Такой вопрос при передачи файла от сервера клиенту по 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
58
59
60
61
62
63
public void SendData()
        {
            // Состав отсылаемого универсального сообщения
            // 1. Заголовок о следующим объектом класса подробной информации дальнейших байтов
            // 2. Объект класса подробной информации о следующих байтах
            // 3. Байты непосредственно готовых к записи в файл или для чего-то иного.
 
            SendInfo si = new SendInfo();
 
 
            //  Если нет сообщения и отсылаемого файла продолжать процедуру отправки нет смысла.
            if (String.IsNullOrEmpty(si.message) == true && String.IsNullOrEmpty(SendFileName) == true) return;
 
            if (SendFileName != null)
            {
                FileInfo fi = new FileInfo(SendFileName);
                if (fi.Exists == true)
                {
                    si.filesize = (int)fi.Length;
                    si.filename = fi.Name;
                }
                fi = null;
            }
 
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, si);
            ms.Position = 0;
            byte[] infobuffer = new byte[ms.Length];
            int r = ms.Read(infobuffer, 0, infobuffer.Length);
            ms.Close();
 
            byte[] header = GetHeader(infobuffer.Length);
            byte[] total = new byte[header.Length + infobuffer.Length + si.filesize];
 
            Buffer.BlockCopy(header, 0, total, 0, header.Length);
            Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length);
 
            // Если путь файла указан, добавим его содержимое в отправляемый массив байтов
            if (si.filesize > 0)
            {
                FileStream fs = new FileStream(SendFileName, FileMode.Open, FileAccess.Read);
                fs.Read(total, header.Length + infobuffer.Length, si.filesize);
                fs.Close();
                fs = null;
            }
 
            // Отправим данные подключенным клиентам
            NetworkStream ns = _tcpClient.tcpClient.GetStream();
            // Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки
            ns.Write(total, 0, total.Length);
 
            // Обнулим все ссылки на многобайтные объекты и попробуем очистить память
            header = null;
            infobuffer = null;
            total = null;
            SendFileName = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
 
            // Подтверждение успешной отправки
            Parent.ShowReceiveMessage("Данные успешно отправлены!");
        }
Если кому вдруг будет нужно вот исходники.
Вложения
Тип файла: rar Server-Client.rar (387.8 Кб, 1 просмотров)
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2019, 16:06
Цитата Сообщение от pafka1997 Посмотреть сообщение
C#
1
int r = ms.Read(infobuffer, 0, infobuffer.Length);
не проверяете сколько реально считали

Цитата Сообщение от pafka1997 Посмотреть сообщение
C#
1
2
3
4
// Отправим данные подключенным клиентам 
NetworkStream ns = _tcpClient.tcpClient.GetStream(); 
// Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки 
ns.Write(total, 0, total.Length);
навеное у вас должен быть список _tcpClient-клиентов, проходите циклом и каждому отсылаете total. В идеале рассывать нужно паралельно.

к слову зачем пляски с total/header, если можно сразу

C#
1
bf.Serialize(ns, si);
p.s. using... нигде нет using...
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.03.2019, 16:52  [ТС]
Wolfdp, попробовал через цикл, не выходит. Он будто не видит первое подключение, а зацилин только на последнем.
Миниатюры
Управление через WEB  
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2019, 16:53
pafka1997, можно пример как пробовали?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.03.2019, 16:56  [ТС]
И да, если от последнего подключения отключиться получается так, что сервер при отправки сообщения просто падает. Такое впечатление, что он после второго подключения перестает видеть первое подключение.

Добавлено через 28 секунд
Wolfdp,
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
        public void SendData()
        {
            // Состав отсылаемого универсального сообщения
            // 1. Заголовок о следующим объектом класса подробной информации дальнейших байтов
            // 2. Объект класса подробной информации о следующих байтах
            // 3. Байты непосредственно готовых к записи в файл или для чего-то иного.
            while (true)
            {
                SendInfo si = new SendInfo();
                si.message = Parent.textBoxSend.Text;
 
 
                //  Если нет сообщения и отсылаемого файла продолжать процедуру отправки нет смысла.
                if (String.IsNullOrEmpty(si.message) == true && String.IsNullOrEmpty(SendFileName) == true) return;
 
                if (SendFileName != null)
                {
                    FileInfo fi = new FileInfo(SendFileName);
                    if (fi.Exists == true)
                    {
                        si.filesize = (int)fi.Length;
                        si.filename = fi.Name;
                    }
                    fi = null;
                }
 
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, si);
                ms.Position = 0;
                byte[] infobuffer = new byte[ms.Length];
                int r = ms.Read(infobuffer, 0, infobuffer.Length);
                ms.Close();
 
                byte[] header = GetHeader(infobuffer.Length);
                byte[] total = new byte[header.Length + infobuffer.Length + si.filesize];
 
                Buffer.BlockCopy(header, 0, total, 0, header.Length);
                Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length);
 
                // Если путь файла указан, добавим его содержимое в отправляемый массив байтов
                if (si.filesize > 0)
                {
                    FileStream fs = new FileStream(SendFileName, FileMode.Open, FileAccess.Read);
                    fs.Read(total, header.Length + infobuffer.Length, si.filesize);
                    fs.Close();
                    fs = null;
                }
 
                // Отправим данные подключенным клиентам
                NetworkStream ns = _tcpClient.tcpClient.GetStream();
                // Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки
                ns.Write(total, 0, total.Length);
 
                // Обнулим все ссылки на многобайтные объекты и попробуем очистить память
                header = null;
                infobuffer = null;
                total = null;
                SendFileName = null;
                Parent.labelFileName.Text = "";
                GC.Collect();
                GC.WaitForPendingFinalizers();
 
                // Подтверждение успешной отправки
                Parent.ShowReceiveMessage("Данные успешно отправлены!");
                Thread.Sleep(2000);
            }
        }
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2019, 17:01
цикл не на все нужно, а только на NetworkStream
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
29.03.2019, 17:06  [ТС]
Wolfdp, Там дело не в этом. Сервер не видит первое подключение если произошло второе подключение.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2019, 17:08
_tcpClient нужно хранить каждый для своего подключения. В текущем коде вы обращаетесь только к одному.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
30.03.2019, 19:51  [ТС]
Wolfdp, У меня не получается в этом проекте отправить нескольким людям сообщение, в прошлом проекте все работает в этом нет, попробовал сделать все как в прошлом и все равно не работает в чем ошибка может быть не знаю.

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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
using System;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Drawing;
 
namespace TcpSendFiles
{
    /// Класс для передачи десериализированного контейнера при 
    /// возникновении события получения сетевых данных.
    class ReceiveEventArgs : EventArgs
    {
        private SendInfo _sendinfo;
 
        public ReceiveEventArgs(SendInfo sendinfo)
        {
            _sendinfo = sendinfo;
        }
 
        public SendInfo sendInfo
        {
            get { return _sendinfo; }
        }
 
    }
 
    /// Класс способный выступать в роли сервера или клиента в TCP соединении.
    /// Отправляет и получает по сети файлы и текстовые сообщения.
    class TcpModule
    {
        
        #region Определение событий сетевого модуля
 
        // Типы делегатов для обработки событий в паре с соответствующим объектом события.
        // Обработчики события акцептирования (принятия клиентов) прослушивающим сокетом
        public delegate void AcceptEventHandler(object sender);
        public event AcceptEventHandler Accept; 
        
        // Обработчики события подключения клиента к серверу
        public delegate void ConnectedEventHandler(object sender, string result);
        public event ConnectedEventHandler Connected;
 
        // Обработчики события отключения конечных точек (клиентов или сервера)
        public delegate void DisconnectedEventHandler(object sender, string result);
        public event DisconnectedEventHandler Disconnected;
 
        // Обработчики события извлечения данных 
        public delegate void ReceiveEventHandler(object sender, ReceiveEventArgs e);
        public event ReceiveEventHandler Receive;
 
        #endregion
 
 
        #region Объявления членов класса
 
        // Родительская форма необходима для визуальной информации 
        // о внутреннем состоянии и событиях работы сетвого модуля.
        public Form1 Parent;
        // Прослушивающий сокет для работы модуля в режиме сервера TCP
        private TcpListener _tcpListener;
        // Удобный контейнер для подключенного клиента.
        private TcpClientData _tcpClient;
        /// Возможные режимы работы TCP модуля
        public enum Mode { indeterminately, Server, Client};
        /// Режим работы TCP модуля
        public Mode modeNetwork;
 
        #endregion
 
 
        #region Интерфейсная часть TCP модуля
        /// Запускает сервер, прослушивающий все IP адреса, и одновременно
        /// метод асинхронного принятия (акцептирования) клиентов.
        public void StartServer()
        {
            if (modeNetwork == Mode.indeterminately)
            {
                try
                {
                    string IP = "127.0.0.1";
                    int port = int.Parse("15000");
                    _tcpListener = new TcpListener(IPAddress.Parse(IP), port);
                    _tcpListener.Start();
                    _tcpListener.BeginAcceptTcpClient(AcceptCallback, _tcpListener);
                    modeNetwork = Mode.Server;
 
                    Parent.ChangeBackColor(Color.Plum);
                }
                catch (Exception e)
                {
                    _tcpListener = null;
                    Parent.ShowReceiveMessage(e.Message);
                }
            }
            else
            {
                SoundError(); 
            }
        }
        /// Остановка сервера
        public void StopServer()
        {
            if (modeNetwork == Mode.Server)
            {
                modeNetwork = Mode.indeterminately;
                _tcpListener.Stop();
                _tcpListener = null;
                DeleteClient(_tcpClient);
                Parent.ChangeBackColor(Color.FromKnownColor(KnownColor.Control));
            }
        }
 
        /// Отключение клиента от сервера
        public void DisconnectClient()
        {
            if (modeNetwork == Mode.Client)
            {
                modeNetwork = Mode.indeterminately;
                DeleteClient(_tcpClient);
            }
        }
 
        private void DeleteClient(TcpClientData mtc)
        {
            if (mtc != null && mtc.tcpClient.Connected == true)
            {
                mtc.tcpClient.GetStream().Close(); // по настоянию MSDN закрываем поток отдельно у клиента
                mtc.tcpClient.Close(); // затем закрываем самого клиента
            }
        }
 
        /// Метод упрощенного создания заголовка с информацией о размере данных отправляемых по сети.
        /// <param name="length">длина данных подготовленных для отправки по сети</param>
        /// <returns>возращает байтовый массив заголовка</returns>
        private byte[] GetHeader(int length)
        {
            string header = length.ToString();
            if (header.Length < 9)
            {
                string zeros = null;
                for (int i = 0; i < (9 - header.Length); i++)
                {
                    zeros += "0";
                }
                header = zeros + header;
            }
            byte[] byteheader = Encoding.Default.GetBytes(header);
            return byteheader;
        }
 
        public string SendFileName = null;
        public void SendData()
        {
            // Состав отсылаемого универсального сообщения
            // 1. Заголовок о следующим объектом класса подробной информации дальнейших байтов
            // 2. Объект класса подробной информации о следующих байтах
            // 3. Байты непосредственно готовых к записи в файл или для чего-то иного.
 
            SendInfo si = new SendInfo();
            si.message = Parent.textBoxSend.Text;
 
            //  Если нет сообщения и отсылаемого файла продолжать процедуру отправки нет смысла.
            if (String.IsNullOrEmpty(si.message) == true && String.IsNullOrEmpty(SendFileName) == true) return;
 
            if (SendFileName != null)
            {
                FileInfo fi = new FileInfo(SendFileName);
                if (fi.Exists == true)
                {
                    si.filesize = (int)fi.Length;
                    si.filename = fi.Name;
                }
                fi = null;
            }
 
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, si);
            ms.Position = 0;
            byte[] infobuffer = new byte[ms.Length];
            int r = ms.Read(infobuffer, 0, infobuffer.Length);
            ms.Close();
 
            byte[] header = GetHeader(infobuffer.Length);
            byte[] total = new byte[header.Length + infobuffer.Length + si.filesize];
 
            Buffer.BlockCopy(header, 0, total, 0, header.Length);
            Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length);
 
            // Если путь файла указан, добавим его содержимое в отправляемый массив байтов
            if (si.filesize > 0)
            {
                FileStream fs = new FileStream(SendFileName, FileMode.Open, FileAccess.Read);
                fs.Read(total, header.Length + infobuffer.Length, si.filesize);
                fs.Close();
                fs = null;
            }
 
            // Отправим данные подключенным клиентам
            NetworkStream ns = _tcpClient.tcpClient.GetStream();
 
            // Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки
            ns.Write(total, 0, total.Length);
 
            // Обнулим все ссылки на многобайтные объекты и попробуем очистить память
            header = null;
            infobuffer = null;
            total = null;
            SendFileName = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
 
            // Подтверждение успешной отправки
            Parent.ShowReceiveMessage("Данные успешно отправлены!");
        }
 
        /// Универсальный метод останавливающий работу сервера и закрывающий все сокетыю
        /// вызывается в событии закрытия родительской формы.
        public void CloseSocket()
        {
            StopServer();
            DisconnectClient();
        }
 
        /// Звуковое сопровождение ошибок.
        private void SoundError()
        {
            Console.Beep(3000, 30);
            Console.Beep(1000, 30);
        }
 
        #endregion
 
        #region Асинхронные методы сетевой работы TCP модуля
        /// Обратный метод завершения принятия клиентов
        public void AcceptCallback(IAsyncResult ar)
        {
            if (modeNetwork == Mode.indeterminately) return;
 
            TcpListener listener = (TcpListener)ar.AsyncState;
            try
            {
                _tcpClient = new TcpClientData();
                _tcpClient.tcpClient = listener.EndAcceptTcpClient(ar);
 
                // Немедленно запускаем асинхронный метод извлечения сетевых данных
                // для акцептированного TCP клиента
                NetworkStream ns = _tcpClient.tcpClient.GetStream();
                _tcpClient.buffer = new byte[global.LENGTHHEADER];
                ns.BeginRead(_tcpClient.buffer, 0, _tcpClient.buffer.Length, new AsyncCallback(ReadCallback), _tcpClient);
 
                // Продолжаем ждать запросы на подключение
                listener.BeginAcceptTcpClient(AcceptCallback, listener);
 
                // Активация события успешного подключения клиента
                if (Accept != null)
                {
                    Accept.BeginInvoke(this, null, null);
                }
            }
            catch
            {
                // Обработка исключительных ошибок возникших при акцептирования клиента.
                SoundError();
            }
        }
 
        /// Метод вызываемый при завершении попытки поключения клиента
        public void ConnectCallback(IAsyncResult ar)
        {
            string result = "Подключение успешно!";
            try
            {
                // Получаем подключенного клиента
                TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;
                NetworkStream ns = myTcpClient.tcpClient.GetStream();
                myTcpClient.tcpClient.EndConnect(ar);
 
                // Запускаем асинхронный метод чтения сетевых данных для подключенного TCP клиента
                myTcpClient.buffer = new byte[global.LENGTHHEADER];
                ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);
                Parent.ChangeBackColor(Color.Goldenrod);
 
            }
            catch (Exception e)
            {
                //MessageBox.Show(e.Message);
                // Обработка ошибок подключения
                DisconnectClient();
                result = "Подключение провалено!";
                SoundError();
            }
 
            // Активация события успешного или неуспешного подключения к серверу,
            // здесь серверу можно отослать ознакомительные данные о себе (например, имя клиента)
            if (Connected != null)
                Connected.BeginInvoke(this, result, null, null);
        }
 
        /// Метод асинхронно вызываемый при наличие данных в буферах приема.
        public void ReadCallback(IAsyncResult ar)
        {
            if (modeNetwork == Mode.indeterminately) return;
 
            TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;
 
            try
            {
                NetworkStream ns = myTcpClient.tcpClient.GetStream();
 
                int r = ns.EndRead(ar);
 
                if (r > 0)
                {
                    // Из главного заголовка получим размер массива байтов информационного объекта
                    string header = Encoding.Default.GetString(myTcpClient.buffer);
                    int leninfo = int.Parse(header);
 
                    // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета
                    MemoryStream ms = new MemoryStream(leninfo);
                    byte[] temp = new byte[leninfo];
                    r = ns.Read(temp, 0, temp.Length);
                    ms.Write(temp, 0, r);
                    BinaryFormatter bf = new BinaryFormatter();
                    ms.Position = 0;
                    SendInfo sc = (SendInfo)bf.Deserialize(ms);
                    ms.Close();
 
                    if (sc.filesize > 0)
                    {
                        // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации
                        FileStream fs = new FileStream(sc.filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize);
                        do
                        {
                            temp = new byte[global.MAXBUFFER];
                            r = ns.Read(temp, 0, temp.Length);
 
                            // Записываем строго столько байтов сколько прочтено методом Read()
                            fs.Write(temp, 0, r);
 
                            // Как только получены все байты файла, останавливаем цикл,
                            // иначе он заблокируется в ожидании новых сетевых данных
                            if (fs.Length == sc.filesize)
                            {
                                fs.Close();
                                fs = null;
                                break;
                            }
                        }
                        while (r > 0);
 
                        temp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
 
                    if (Receive != null)
                        Receive(this, new ReceiveEventArgs(sc));
 
                    myTcpClient.buffer = new byte[global.LENGTHHEADER];
                    ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);
                }
                else
                {
                    DeleteClient(myTcpClient);
 
                    // Событие клиент отключился
                    if (Disconnected != null)
                        Disconnected.BeginInvoke(this, "Клиент отключился!", null, null);
                }
            }
            catch (Exception e)
            {
 
                DeleteClient(myTcpClient);
 
 
                // Событие клиент отключился
                if (Disconnected != null)
                    Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null);
 
                SoundError();
 
            }
 
        }
 
 
        #endregion
 
    }
 
    
    
    ///////////////////////////////////////////////////////////////////////////
    // ВСПОМОГАТЕЛЬНЫЕ КЛАССЫ ДЛЯ ОРГАНИЗАЦИИ СЕТЕВОЙ РАБОТЫ TCP МОДУЛЯ
    ///////////////////////////////////////////////////////////////////////////
 
 
    /// Класс для организации непрерывного извлечения сетевых данных,
    /// для чего необходимо, как минимум, одновременно TcpClient
    /// и буфер приема.
    /// </summary>
    class TcpClientData
    {
        public TcpClient tcpClient = new TcpClient();
 
        // Буфер для чтения и записи данных сетевого потока
        public byte[] buffer = null;
 
        public TcpClientData()
        {
            tcpClient.ReceiveBufferSize = global.MAXBUFFER;
        }
    }
 
 
    /// <summary>
    /// Класс для отправки текстового сообщения и 
    /// информации о пересылаемых байтах следующих последними в потоке сетевых данных.
    /// </summary>
    [Serializable]
    class SendInfo
    {
        public string message;
        public string filename;
        public int filesize;
    }
 
    ///////////////////////////////////////////////////////////////////////////
 
}
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
30.03.2019, 20:41
Цитата Сообщение от pafka1997 Посмотреть сообщение
C#
1
private TcpClientData _tcpClient;
должен быть

C#
1
private List<TcpClientData> _tcpClients;
а так вы сейчас загоняете в переменую последнее подключение, и естественно ваш код терят линку на остальные.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
30.03.2019, 21:08  [ТС]
Wolfdp, Если так делать тогда вылазит куча ошибок
Миниатюры
Управление через WEB  
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
30.03.2019, 21:10
pafka1997, подумайте пожалуйста что бы делаете и зачем, а не тупо замените одну строчку.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
31.03.2019, 09:57
Wolfdp, что думаете по моему вопросу вверху страницы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2019, 09:57

Управление приложением через веб-форму
В общем есть у меня одна программа на C# (WinForms), которая висит на сервере и выполняет определенные действия. Появилась необходимость...

Удаленное управление компьютером через Android
Не так давно появилась идея по созданию программы для удаленного управление компьютером через платформу Android. На языке программирования...

Запуск процесса и управление им через Хендл
Доброго времени суток! Очень нужен полный пример кода на основе блокнота (notepad) следующего типа: Щелчок по кнопке { 1)...

Управление буфером обмена через другой поток
Надо удалять, добавлять, изменять буфер обмена через фоновой поток. //При стандартном Clipboard.SetText(&quot;бла&quot;); //...

Управление вышестоящим классом, через вложенный класс
Имееться класс хранящий переменный и методы. в него вложен класс CellGET который будет изменять и выдавать переменные public class My01...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru