Передача информации по сокетам - 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();
            }
         }
      }
   }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы