Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15

Файл приходит не целиком от клиента к клиенту

27.11.2014, 14:26. Показов 810. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. При отправке обычного текстового файла размером 3.50 КБ с первого пк на второй приходит текстовый файл размером 2.30 КБ. Помогите исправить такую несправедливость

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
private void IP_Enter(object sender, EventArgs e)
        {
            if (IP.Text == (String)IP.Tag)
            {
                IP.Text = "";
            }
        }
 
        private void IP_Leave(object sender, EventArgs e)
        {
            if (String.IsNullOrWhiteSpace(IP.Text))
            {
                IP.Text = (String)IP.Tag;
            }
        }
 
        public SGSClient()
        {
            InitializeComponent();
            // Создаем поток для приема сообщений
            new Thread(new ThreadStart(Receiver)).Start();
            new Thread(new ThreadStart(FileReceiver)).Start();
        }
 
        // Метод потока
        protected void Receiver()
        {
            // Создаем Listener на порт "по умолчанию"
            TcpListener Listen = new TcpListener(7000);
            // Начинаем прослушку
            Listen.Start();
            // и заведем заранее сокет
            Socket ReceiveSocket;
            while (true)
            {
                try
                {
                    // Пришло сообщение
                    ReceiveSocket = Listen.AcceptSocket();
                    Byte[] Receive = new Byte[256];
                    // Читать сообщение будем в поток
                    using (MemoryStream MessageR = new MemoryStream())
                    {
                        // Количество считанных байт
                        Int32 ReceivedBytes;
                        do
                        {
                            // Собственно читаем
                            ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
                            // и записываем в поток
                            MessageR.Write(Receive, 0, ReceivedBytes);
                            // Читаем до тех пор, пока в очереди не останется данных
                        }
                        while (ReceiveSocket.Available > 0);
                        // Добавляем изменения в ChatBox
                        ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получено" + Encoding.Default.GetString(MessageR.ToArray()), ChatBox });
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
 
        // Метод потока
        protected void FileReceiver()
        {
            // Создаем Listener на порт "по умолчанию"
            TcpListener Listen = new TcpListener(6999);
            // Начинаем прослушку
            Listen.Start();
            // и заведем заранее сокет
            Socket ReceiveSocket;
            while (true)
            {
                try
                {
                    // Пришло сообщение
                    ReceiveSocket = Listen.AcceptSocket();
                    Byte[] Receive = new Byte[256];
                    // Читать сообщения будем в поток
                    using (MemoryStream MessageR = new MemoryStream())
                    {
                        // Количество считанных байт
                        Int32 ReceivedBytes;
                        Int32 Firest256Bytes = 0;
                        String FilePath = "";
                        do
                        {// Собственно читаем
                            ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
                            // Разбираем первые 256 байт
                            if (Firest256Bytes < 256)
                            {
                                Firest256Bytes += ReceivedBytes;
                                Byte[] ToStr = Receive;
                                if (Firest256Bytes > 256)
                                {
                                    Int32 Start = Firest256Bytes - ReceivedBytes;
                                    Int32 CountToGet = 256 - Start;
                                    Firest256Bytes = 256;
                                    ToStr = Receive.Take(CountToGet).ToArray();
                                    Receive = Receive.Skip(CountToGet).ToArray();
                                    MessageR.Write(Receive, 0, ReceivedBytes);
                                }
                                // Накапливаем имя файла
                                FilePath += Encoding.Default.GetString(ToStr);
                            }
                            else
 
                                // и записываем в поток
                                MessageR.Write(Receive, 0, ReceivedBytes);
                            // Читаем до тех пор, пока в очереди не останется данных
                        } while (ReceivedBytes == Receive.Length);
                        // Убираем лишние байты
                        String resFilePath = FilePath.Substring(0, FilePath.IndexOf('\0'));
                        using (var File = new FileStream(resFilePath, FileMode.Create))
                        {// Записываем в файл
                            File.Write(MessageR.ToArray(), 0, MessageR.ToArray().Length);
                        }// Уведомим пользователя
                        ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Получено" + resFilePath, ChatBox });
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
 
        void ThreadSend(object Message)
        {
            try
            {
                // Проверяем входной объект на соответствие строке
                String MessageText = "";
                if (Message is String)
                {
                    MessageText = Message as String;
                }
                else
                    throw new Exception("На вход необходимо подавать строку");
 
                Byte[] SendBytes = Encoding.Default.GetBytes(MessageText);
                // Создаем сокет, коннектимся
                IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 7000);
                Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Connector.Connect(EndPoint);
                Connector.Send(SendBytes);
                Connector.Close();
                // Изменяем поле сообщений
 
                ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Послали " + MessageText, ChatBox });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        delegate void SendMsg(String Text, RichTextBox Rtb);
 
        SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) =>
            {
                Rtb.Text += Text + "\n";
            };
 
 
 
        private void btnSend_Click(object sender, EventArgs e)
        {// Отправляем файл
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                // Коннектимся
                IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 6999);
                Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Connector.Connect(EndPoint);
                // Получаем имя из полного пути к файлу
                StringBuilder FileName = new StringBuilder(openFileDialog1.FileName);
                // Выделяем имя файла
                int index = FileName.Length - 1;
                while (FileName[index] != '\\' && FileName[index] != '/')
                {
                    index--;
                }
                // Получаем имя файла
                String resFileName = "";
                for (int i = index + 1; i < FileName.Length; i++)
                    resFileName += FileName[i];
                // Записываем в лист
                List<Byte> First256Bytes = Encoding.Default.GetBytes(resFileName).ToList();
                Int32 Diff = 256 - First256Bytes.Count;
                // Остаток заполняем нулями
                for (int i = 0; i < Diff; i++)
                    First256Bytes.Add(0);
                // Начинаем отправку данных
                Byte[] ReadedBytes = new Byte[256];
                using (var FileStream = new FileStream(openFileDialog1.FileName, FileMode.Open))
                {
                    using (var Reader = new BinaryReader(FileStream))
                    {
                        Int32 CurrenrReadedBytesCount;
                        // Вначале отправим название файла
                        Connector.Send(First256Bytes.ToArray());
                        do
                        {
                            // Затем по частям файл
                            CurrenrReadedBytesCount = Reader.Read(ReadedBytes, 0, ReadedBytes.Length);
                            Connector.Send(ReadedBytes, CurrenrReadedBytesCount, SocketFlags.None);
                        }
                        while (CurrenrReadedBytesCount == ReadedBytes.Length);
                    }
                }
                // Завершаем передачу данных
                Connector.Close();
 
            }
        }
 
        private void OnSend(IAsyncResult ar)
        {
            try
            {
                clientSocket.EndSend(ar);
            }
            catch (ObjectDisposedException)
            { }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "SGSclientTCP: " + strName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2014, 14:26
Ответы с готовыми решениями:

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

Загрузить файл от сервера к клиенту без участия клиента
Podskajite, pojaluista, kak download file from server to client bez uchastia klienta (bez otkriti'ia okna 'save or open'). Prichiom fail...

Boost Asio Передача файла от клиента к клиенту
Есть у кого нибудь реализация сервера-передатчика для передачи файлов от клиента к клиенту?

5
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
27.11.2014, 14:32
Марина_23, возможно потому что поток отправитель завершается, до того как клиент принял все данные?

Добавлено через 39 секунд
Марина_23, и кстати читать по 256 байт не очень хорошо, используйте хотя бы 4096
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
27.11.2014, 14:36  [ТС]
drondez, конкретнее что где поменять пожалуйста
0
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
27.11.2014, 14:38
Марина_23, я бы ввел подтверждение приема клиентом файла. Т.е. сервер после отправки ждет сообщения "ОК", клиент как принял все данные его отправляет и потом соединение разрывается
0
0 / 0 / 0
Регистрация: 10.11.2014
Сообщений: 15
27.11.2014, 14:42  [ТС]
drondez, мне просто надо, чтобы файл приходил целиком, а не часть.
0
45 / 45 / 32
Регистрация: 15.04.2011
Сообщений: 187
27.11.2014, 15:04
Марина_23, восстановил проект, у меня все работает к примеру...

Добавлено через 10 минут
Марина_23, вот мой пример передачи файлов
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
private void upload(string fileName, BinaryWriter bw) //bw - поток из сокета
        {
            try
            {
                BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open));
                byte[] buff = new byte[4096];
                long size = 0;
                long loaded = 0;
                size = new FileInfo(fileName).Length;
                bw.Write(size);
                bw.Write(fileName);
                
                do
                {
                    bw.Write(br.ReadBytes(4096));
                    loaded += 4096;
                   
                   
                } while (loaded < size);
                br.Close();
            }
            catch (Exception ex)
            {
                Delegats.write(ex.Message);
            }
        }
Добавлено через 35 секунд
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
private bool download(string fileName,  NetworkStream ns) //имя файла было получено ранее
        {
            try
            {
                long size = 0;
                byte[] buffer = new byte[4096];
                string name = "";
                long j=0;
                
                bw.Write(fileName);
                size = br.ReadInt64();
                name = br.ReadString();
                
                FileStream fs = new FileStream(name, FileMode.Create);
                
                
 
                while (j < size) 
                {
                    ns.Flush();
                    ns.Read(buffer, 0, (int)4096);
                    fs.Write(buffer, 0, (int)4096);
                    j += 4096;
                    Delegats.ProgressChanged(Convert.ToInt64(((((double)j / (double)size)) * 100)));
                    Delegats.FullProgressChanged(Convert.ToInt64(((((double)(j+downloaded) / (double)fullSize)) * 100)));
                    
                }
                downloaded += size;
                Delegats.WriteMessage(downloaded.ToString()+" байт");
                fs.Close();
                fs = new FileStream(name, FileMode.Open);
                fs.SetLength(size);
                fs.Close();
             
                
                return true;
            }
            catch (Exception ex)
            {
                Delegats.WriteMessage(ex.ToString());
                return false;
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2014, 15:04
Помогаю со студенческими работами здесь

Передача файлов от клиента к клиенту, минуя сервер(как в icq).
Доброго времени суток! Имеется простенький сервер и клиент, основанные на сокетах(TClientSocket и TServerSocket). Сервер...

Как передать звук по сети от клиента клиенту через сервер
Всем Привет! Народ помогите подскажите... Пишу программу с использованием WPF и мне нужно передать звук от одного клиента другому......

Передача от клиента к серверу и от сервера к клиенту через канал fifo()
Всем привет. Мне нужно через канал fifo отправить от клиента к серверу строку, сервер должен записать ее с задом-наперед и передать ее к...

Прием сервером от клиента чисел, затем сервер умножает и отправляет результат клиенту
Здравствуйте! Помогите пожалуйста сделать клиент-серверное приложение. Клиент отправляет серверу два числа, сервер принимает их и...

При переходе от клиента ORACLe10 к клиенту ORACLe11 в делфийской программе не могу выбрать кодировку для грид-полей
Помогите , кто знает !!! После установки на локальной машине клиента оракл11 в гриде текстовые поля из БД стали отображаться строкой...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru