Передача файла TCP

 
0
 
.NET
ava
OXOTHUK | 07.01.2008, 23:51
Что я делаю не правильно? мне нужно передать файл(в данном случае картинку), но приходит немножко не то(при открытии как текста есть небольшие отличия в начале и конце).
Отправление клиентом:

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() большие данные, они гарантировано придут целиком, не разорваашись? компонент сам соберёт куски, если указано количество байт, которое надо принять?
Comments (2)
ava
Alexsar | 02.02.2008, 23:20 #
лучше используй класс 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));
..........
ava
Moid | 08.10.2008, 15:45 #
Цитата (Alexsar @ 2.2.2008, 23:20)
лучше используй класс NetworkStream, он предоставляет поток сокета, а передачу осуществить с помощью метода Serialize класса BinaryFormatter.

вот пример

Начал разбираться с клиент-серверными приложениями.
Создал клиентский сервис, написал внем предложенную Alexsar процедуру по отправке файла на удаленный сервер.
Не пойму как записать функцию-приема файла на сервере? Нужно чтобы она умела возвращать клиенту булевское значение...
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Alexsar   OXOTHUK   Moid
advanced
Submit