Передача информации по сокетам - C#
Формулировка задачи:
Здравствуйте.
Хочу сделать клиент\сервер'ную программу, которая через сокеты через протокол TCP отправляет файлы. И у меня возникло несколько вопросов.
Во первых, это тип сокета. Я видел, что есть сокеты типа Stream (потоковые), Raw (дословно переводя - сырые) и еще несколько типов. На сколько я понял, потоковые сокеты самостоятельно разбивают отправляемые данные на пакеты и могут отправить любое количество информации, да еще при этом не надо морочиться с пакетами?
Второй вопрос заключается в следующем : я хочу передать файл в виде "разрешение"|"сам файл", но как это осуществить? Отправить строку, которую методом Split разделить на несколько частей? Или есть какие либо более удобные способы? И если мое предположение по поводу Split верно, то как можно преобразовать FileStream в string?
========================================
Заранее пре-благодарен за помощь!
Решение задачи: «Передача информации по сокетам»
textual
Листинг программы
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Server
{
class Program
{
static void Main(string[] args)
{
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
using(Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
{
try
{
sListener.Bind(ipEndPoint);
sListener.Listen(10);
while(true)
{
Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
using(Socket handler = sListener.Accept())
{
byte[] buffer = new byte[1024];
int count = 0;
using(MemoryStream ms = new MemoryStream())
{
do
{
count = handler.Receive(buffer);
ms.Write(buffer, 0, count);
}
while(count > 0);
ms.Position = 0;
int size = ms.ReadByte();
byte[] arr = new byte[size];
ms.Read(arr, 0, arr.Length);
string exp = Encoding.GetEncoding(1251).GetString(arr);
DateTime time = DateTime.Now;
using(FileStream fs = new FileStream($"Screenshot_{time.ToShortDateString()}_{time.Hour * 3600 + time.Minute * 60 + time.Second}{exp} ", FileMode.Create))
{
ms.CopyTo(fs);
Console.WriteLine($"Сервер сохранил скриншот размером: {ms.Length} байт");
}
}
Console.WriteLine("Сервер завершил соединение с клиентом.");
handler.Shutdown(SocketShutdown.Both);
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
Console.ReadLine();
}
}
}
}
}