Передача информации по сокетам - 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(); } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д