Отправка и получение сообщений через сокеты - C#

Узнай цену своей работы

Формулировка задачи:

Для начала , вот статья с аналоговым примером. Вот метод для получения сообщений :
void Listen(CancellationToken CancellToken){
            MailSocket.Bind(ListenPoint);
            while (!CancellToken.IsCancellationRequested)
            {
                byte[] bytes_Message = new byte[MailSocket.Available];
                EndPoint RemotePoint = this.RemotePoint;
                MailSocket.ReceiveFrom(bytes_Message,ref RemotePoint);
                string result = ToString(bytes_Message);
                DateTime.Now.ToShortTimeString().Print(Color.White,false);
                result.PrintLine(Color.Green,false);
                this.RemotePoint = RemotePoint as IPEndPoint;
            }
        }
А вот отправки :
public void Send(string Message){
            MailSocket.SendTo(ToBytes(Message) , RemotePoint);
        }
Никаких исключений на вольный брег не выбрасывалось , но при этом отправка сообщения не выходит. Инициализация сокета проведена в соответсвии с тем как это сделано в статье.
var c1 = new Chanel("c1","12345",new IPEndPoint(IPAddress.Loopback,4005));
            var c2 = new Chanel("c2","1",new IPEndPoint(IPAddress.Loopback,4004));
            c1.RemotePoint = c2.ListenPoint;
            c1.BeginListen();
            c2.BeginListen();
            c1.Send("FF");
        Console.ReadKey(true);
Вот весь код :
using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using Color = System.ConsoleColor;
namespace Mail
{
    //Прочие вспомогательные классы , используются не все 
    public static class Console_Extensions
    {
        public static void Print(this string a , ConsoleColor PrescribedColor , bool LeaveColor = true){
            var LastColor = Console.ForegroundColor;
            Console.ForegroundColor = PrescribedColor;
            Console.Write(a);
            if (LeaveColor) Console.ForegroundColor = LastColor;
        }
        public static void PrintLine(this string a , ConsoleColor PrescribedColor ,bool LeaveColor = true){
            a.Print(PrescribedColor,LeaveColor);
            Console.WriteLine();
        }
    }
    //Uses FonStart
    public static class AdvancedConsole
    {
        public static void PressKey(string Message,Nullable<ConsoleKey> Key = null ){
            Console.WriteLine(Message);
            if (Key == null) Console.ReadKey(true);
            else while (Console.ReadKey(true).Key != Key) {}
        }
        public static CancellationTokenSource FonStart(Action<CancellationToken> act){
            var CancellToken = new CancellationTokenSource();
            Task.Factory.StartNew( () => act(CancellToken.Token) );
            return CancellToken;
        }
    }
    //Not used
    public class CReader
    {
        bool Disactivated;
        readonly Dictionary<ConsoleKey,Action> Commands;
        public CReader(int Capacity)
        {
            Commands = new Dictionary<ConsoleKey,Action>(Capacity);
        }
        public CReader()
        {
            Commands = new Dictionary<ConsoleKey,Action>();
        }
        public Action this[ConsoleKey key]
        {
            set
            {
                Commands.Add(key,value);
                
            }
            get
            {
                Action result;
                Commands.TryGetValue(key,out result);
                return result;
            }
        }
        public void StartTakingCommands(){
            Disactivated = false;
            while (true)
            {
                Action act;
                if ( Commands.TryGetValue(  Console.ReadKey(true).Key , out act) )
                    act();
                if (Disactivated) break;
            }
        }
        public void StopTakingCommads()
        {
            Disactivated = true;
        }
    }
    //============
    //Основной код
    public class Chanel
    {
        CancellationTokenSource CancellListen;
        
        public readonly string Name;
 
        public readonly string Password;
        
        public readonly string Id;
        
        public static Encoding MessageEncoding = Encoding.Unicode;
        
        public Chanel(string Name, string Password , IPEndPoint ListenPoint)
        {
            this.Name = Name;
            this.Password = Password;
            MailSocket = NewUPDSocket();
            this.ListenPoint = ListenPoint;
        }
        
        public IPEndPoint ListenPoint, RemotePoint = new IPEndPoint(IPAddress.Any,0);
 
        Socket MailSocket;
        
        static byte[] ToBytes(string s){
            return MessageEncoding.GetBytes(s);
        }
        
        static string ToString(byte[] letter_Bytes){
            return MessageEncoding.GetString(letter_Bytes);
        }
        
        static void Close(Socket local_Socket){
            local_Socket.Shutdown(SocketShutdown.Both);
            local_Socket.Close();
        }
        
        static Socket NewUPDSocket(){
            return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        }
            
        void Listen(CancellationToken CancellToken){
            MailSocket.Bind(ListenPoint);
            while (!CancellToken.IsCancellationRequested)
            {
                byte[] bytes_Message = new byte[MailSocket.Available];
                EndPoint RemotePoint = this.RemotePoint;
                MailSocket.ReceiveFrom(bytes_Message,ref RemotePoint);
                string result = ToString(bytes_Message);
                DateTime.Now.ToShortTimeString().Print(Color.White,false);
                result.PrintLine(Color.Green,false);
                this.RemotePoint = RemotePoint as IPEndPoint;
            }
        }
        
        public void Send(string Message){
            MailSocket.SendTo(ToBytes(Message) , RemotePoint);
        }
        
        public void BeginListen(){
            CancellListen = AdvancedConsole.FonStart( Listen );
        }
    }
    
    class Program
    {
        public static void Main()
        {
            
            var c1 = new Chanel("c1","12345",new IPEndPoint(IPAddress.Loopback,4005));
            var c2 = new Chanel("c2","1",new IPEndPoint(IPAddress.Loopback,4004));
            c1.RemotePoint = c2.ListenPoint;
            c1.BeginListen();
            c2.BeginListen();
            c1.Send("FF");
            Console.ReadKey(true);
        }
    }
}

Решение задачи: «Отправка и получение сообщений через сокеты»

textual
Листинг программы
byte[] bytes_Message = new byte[MailSocket.Available];

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


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

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

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