Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
LogerM
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 57
Завершенные тесты: 5
#1

TcpClient передача больших файлов - C#

20.10.2017, 22:16. Просмотров 189. Ответов 0
Метки нет (Все метки)

Есть задача - авто обновление клиентов по сети. Есть клиент, у него папка programm, в этой папки библиотеки dll. Нужно следить
за версиями файлов на сервере и предлагать обновление по необходимости. Потом проверить MD5 и если хэш совпадает заменить существующий файл новой версией.
Код сервера
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
public void Start()
        {
            try
            {
                _listener.Start();
                Status = true;
                _listenThread = new Thread(() =>
                {
                    while (true){
                        
                        try
                        {
                            if (!Status)
                            {
                                break;
                            }
                            var tcpClient = _listener.AcceptTcpClient();
 
                            // передаем соединению ссылку на версии файлов
                            var connection = new Connection(tcpClient, cancel.Token);
                            // запустить обработку соединения в другом потоке
                            connection.Processing();
                            // добавить соединение в коллекцию соединений
                            Connections.Add(connection);
 
 
                        }
                        catch (OperationCanceledException)
                        { }
                        catch (SocketException ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                        catch (InvalidOperationException ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
 
                    }
                }
                );
            }
            catch (SocketException ex)
            {
                MessageBox.Show(ex.Message);
            }
            // сделать поток фоновым
            _listenThread.IsBackground = true;
            // запустить на выполнение
            _listenThread.Start();
Код для типа коллекции, метод запуска потока соеднинения
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
 public void Processing()
        {
            ConnThread = new Thread(() =>
            {
                try
                {
                while (true)
                {
                    try
                    {
                        cancelToken.ThrowIfCancellationRequested();
                    }
                    catch (OperationCanceledException)
                    {
                        Client.Close();
                    }
                   
                    if (Client.Connected)
                    {
                        
                            // буфер для входящих данных
                            byte[] input = new byte[1024];
                            // считываем с потока сообщение клиента
                            receiveData += _clientStream.Read(input, 0, input.Length);
 
                            string incommingCommand = Encoding.ASCII.GetString(input);
 
                            if (incommingCommand.Contains("GetFix1"))
                            {
                                var outcomm = GetByteFile("Fix\\Lib1.dll");
                                _clientStream.Write(outcomm, 0, outcomm.Length);
                            }
 
                            if (incommingCommand.Contains("GetFix2"))
                            {
                                var outcomm = GetByteFile("Fix\\Lib2.dll");
                                _clientStream.Write(outcomm, 0, outcomm.Length);
                            }
 
                            if (incommingCommand.Contains("GetFix3"))
                            {
                                var outcomm = GetByteFile("Fix\\Lib3.dll");
                                _clientStream.Write(outcomm, 0, outcomm.Length);
                            }
 
                            if (incommingCommand.Contains("GetProgramm"))
                            {
                                var outcomm = GetByteFile("Programm\\WpfClient.exe");
                                _clientStream.Write(outcomm, 0, outcomm.Length);
                            }
 
                            if (incommingCommand.Contains("GetVersion"))
                            {
                                var outcomm = version.GetBinary();
                                sendData += outcomm.Length;
                                _clientStream.Write(outcomm, 0, outcomm.Length);
                            }
                        }
                    }
                }
 
                catch (SocketException ex)
                {
                    // MessageBox.Show(ex.Message);
                }
                catch (IOException ex)
                {
                    //MessageBox.Show(ex.Message);
                }
                catch (ObjectDisposedException ex)
                {
 
                }
            }
            );
            ConnThread.IsBackground = true;
            ConnThread.Start();
        }
И код Клиента
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
   _updateThread = new Thread(() =>
            {
                while (true)
                {
 
                    if (Client.Client.Connected)
                    {
                        CompareVersion();
 
                        _netStream = Client.GetStream();
 
                        var buff = Encoding.ASCII.GetBytes(_command);
                        try
                        {
                            _netStream.Write(buff, 0, buff.Length);
                        }
                        catch (IOException ex)
                        {
                            MessageBox.Show(ex.Message + "\n Метод - " + ex.TargetSite, "Ошибка");
                        }
 
                        try
                        {
                                _netStream.Read(_inputBuff, 0, _inputBuff.Length);
                                File.WriteAllBytes("Temp\\Lib1.dll", _inputBuff);
                                NewVersionEvent("Temp\\Lib1.dll");
 
                            }
                            if (_command == "GetFix2")
                            {
                               // XP buffer 8192
                                _netStream.Read(_inputBuff, 0, _inputBuff.Length);
                                File.WriteAllBytes("Temp\\Lib2.dll", _inputBuff);
                                NewVersionEvent("Temp\\Lib2.dll");
                            }
                            if (_command == "GetFix3")
                            {
                                _netStream.Read(_inputBuff, 0, _inputBuff.Length);
                                File.WriteAllBytes("Temp\\Lib3.dll", _inputBuff);
                                NewVersionEvent("Temp\\Lib3.dll");
                            }
                            if (_command == "GetProgramm")
                            {
                                _netStream.Read(_inputBuff, 0, _inputBuff.Length);
                                File.WriteAllBytes("Temp\\WpfClient.exe", _inputBuff);
                                NewVersionEvent("Temp\\WpfClient.exe");
                            }
                            if (_command == "GetVersion")
                            {
                                int read = _netStream.Read(_inputBuff, 0, _inputBuff.Length);
                                var bf = new BinaryFormatter();
                                var ms = new MemoryStream(_inputBuff.Take(read).ToArray());
                                ServerVersion = bf.Deserialize(ms) as VersionFiles;
                            }
 
 
                        }
                        catch (IOException ex)
                        {
                            MessageBox.Show(ex.Message, "WpfClient строка 115 - IOException");
                        }
                        catch (SerializationException ex)
                        {
                            MessageBox.Show(ex.Message, "WpfClient - SerializationException");
                        }
                        Thread.Sleep(5000);
                    }
                    else
                    {
                        try
                        {
                            // больше трех попыток - отмена, оповестить
                            if (_countConnect == 3)
                            {
                                MessageBox.Show(" Сервер не отвечает. Обновление невозможно");
                                _updateThread.Abort();
                            }
                            _countConnect++;
                            Client.Close();
                            Client = new TcpClient(AddressFamily.InterNetwork);
                            Client.Connect(IpServer, Port);
 
                        }
                        catch (SocketException ex)
                        {
                            //MessageBox.Show(ex.Message);
                        }
                    }
                }
            }
            );
            _updateThread.IsBackground = true;
            _updateThread.Start();
        }
Размер массива на прием байтов устанавливается с полученного файла версий .
Вот эта строка
C#
1
_netStream.Read(_inputBuff, 0, _inputBuff.Length);
считывает содержимое потока в память. Файлы требуется передавать большие (XP с 512 Мб ОЗУ не захотела принимать файл 130 Мб).
Помогите советом, как с NetStream писать кусками в файл ? Версии файлов, их размер и MD5 передаю с помощью сериализации одним классом. Пока много недочетов, на самое главное как передать большой файл (200 Мб+) на тот же XP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2017, 22:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос TcpClient передача больших файлов (C#):

Передача больших файлов по сокетам
Как можно решить проблему? У меня на входе массив байт разного размера....

Передача больших файлов используя Socket
Помогите! Как правильно организовать передачу больших файлов используя Socket....

Передача больших файлов по протоколу UDP
Как отправлять большие файлы ? Помогите с реализацией пожалуйста. Передача...

TCP сокет. Передача больших файлов
Собственно пишу курсовую работу. Что-то на подобии DROPBOX. Передача файлов...

Чат локальной сети. Передача больших файлов
есть проэкт, скачаный с интернета. Суть в чем это локальный сайт с...

Бинарная сериализация и передача через TcpClient
Парни помогите..уже не знаю куда смотреть..Надежда только сюда..уже...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2017, 22:16
Привет! Вот еще темы с решениями:

Потоковая передача больших данных по TCP из Java в C#
Добрый день, Прошу помощи в разборе полетов: Задача: передать картинку с...

Просмотр больших файлов
Есть код программы которая открывает большие файлы и позволяет динамически...

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на...

Парсинг больших строковых файлов
Задача следующая: Нужно в текстовом файле (файл может быть очень большого...


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

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

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