Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача файла TCP, TcpListener TcpClient 
:(
    Опции темы
OXOTHUK
Дата 7.1.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Что я делаю не правильно? мне нужно передать файл(в данном случае картинку), но приходит немножко не то(при открытии как текста есть небольшие отличия в начале и конце).
Отправление клиентом:
Код

FileStream file = new FileStream(Filename, FileMode.Open);
using (BinaryReader reader = new BinaryReader(file))
{
w2.Write(file.Length); //w2 - binarywriter для stream'а от tcpclient'а
w2.Write(reader.ReadBytes((int)file.Length), 0, (int)file.Length);
}
file.Close();

Передача сервером:
Код

int j = r.ReadInt32(); //r - binaryreader для stream'а, полученнгого от socket'а tcplistener'а
w.Write(j); //w - соответственно writer
w.Write(r.ReadBytes(j), 0, j);

Получение клиентом:
Код

int j = r2.ReadInt32(); //r2 - соответсвенно reader от tcpclient'а
FileStream file = new FileStream(@"d:\1.jpg", FileMode.Create);
file.Write(r2.ReadBytes(j), 0, j);
file.Close();


Так же пара вопросов новичка:
Если передавать моим методом через binarywriter.write() и принимать через binaryreader.read() большие данные, они гарантировано придут целиком, не разорваашись? компонент сам соберёт куски, если указано количество байт, которое надо принять?
PM MAIL   Вверх
Alexsar
Дата 2.2.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



лучше используй класс NetworkStream, он предоставляет поток сокета, а передачу осуществить с помощью метода Serialize класса BinaryFormatter. 
вот пример

Код

//отправка байтов на клиенте

eclient = new TcpClient(ipaddres, port);
NetworkStream writerStream = eclient.GetStream();
BinaryFormatter format = new BinaryFormatter();

byte[] buf = new byte[1024 * 1024];
int count;

FileStream fs = new FileStream(files, FileMode.Open);
BinaryReader br = new BinaryReader(fs);


while ((count = br.Read(buf, 0, 1024 * 1024)) > 0)
  {
      format.Serialize(writerStream, buf);
   }


//приём байтов на сервере

//связываем сервер с локальным портом
TcpListener clientListener = new TcpListener(port);
//начинаем слушать
clientListener.Start();

//даём согласие на соединение
TcpClient client = clientListener.AcceptTcpClient();
//получаем поток сокета
NetworkStream readerStream = client.GetStream();
BinaryFormatter outformat = BinaryFormatter();
........
//в цикле получить данные из потока и сохранять с помощью BinaryWriter
byte[] buf  = (byte[] )(outformat.Deserialize(readerStream));
..........

PM MAIL   Вверх
Moid
Дата 8.10.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: нет
Всего: 3



Цитата(Alexsar @ 2.2.2008,  23:20)
лучше используй класс NetworkStream, он предоставляет поток сокета, а передачу осуществить с помощью метода Serialize класса BinaryFormatter. 
вот пример

Начал разбираться с клиент-серверными приложениями. 
Создал клиентский сервис, написал внем  предложенную Alexsar процедуру по отправке файла на удаленный сервер.
Не пойму как записать функцию-приема файла на сервере? Нужно чтобы она умела возвращать клиенту булевское значение...


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.