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