17 авг. 2012 г.

UDPClient отправка и прием сообщений

      UDP (англ. User Datagram Protocol — протокол пользовательских датаграмм) — один из ключевых элементов Internet Protocol Suite (более известного как TCP/IP), набора сетевых протоколов для Интернета. С UDP, компьютерные приложения могут посылать сообщения (в данном случае называемые датаграммами) другим хостам по IP-сети без необходимости предварительного сообщения для установки специальных каналов передачи или путей данных. Протокол был разработан Дэвидом П. Ридом в 1980 году и официально определен в RFC 768.

      UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа. UDP подразумевает, что проверка ошибок и исправление либо не необходимы, либо должны исполняться в приложении. Чувствительные ко времени приложения часто используют UDP, так как предпочтительнее сбросить пакеты, чем ждать задержавшиеся пакеты, что может оказаться невозможным в системах реального времени. При необходимости исправления ошибок на сетевом уровне интерфейса приложение может задействовать TCP или SCTP, разработанные для этой цели.
Природа UDP как протокола без сохранения состояния также полезна для серверов, отвечающих на небольшие запросы от огромного числа клиентов, например DNS и потоковые мультимедийные приложения вроде IPTV, Voice over IP, протоколы туннелирования IP и многие онлайн-игры.


Client:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
 
namespace NoticeSystemClient
{
    public partial class MainForm : Form
    {
        public delegate void ShowMessage(string message);
        public ShowMessage myDelegate;
        Int32 port = 11000;
        UdpClient udpClient = new UdpClient(11000);
        Thread thread;
        public MainForm()
        {
            //CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }
 
        private void MainForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                thread.Abort();
                udpClient.Close();
                Close();
            }
        }
 
        private void ReceiveMessage()
        {                      
            while (true)
            {
                IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, port);
                byte[] content = udpClient.Receive(ref remoteIPEndPoint);
 
                if (content.Length > 0)
                {
                    string message = Encoding.ASCII.GetString(content);
                    
                    this.Invoke(myDelegate, new object[] { message });
                }
            }
        }
 
 
        private void ShowMessageMethod(string message)
        {
            richText.Text = message;
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {            
            myDelegate = new ShowMessage(ShowMessageMethod);
            thread = new Thread(new ThreadStart(ReceiveMessage));
            thread.IsBackground = true;
            thread.Start();
        }
    }
}

Server:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
 
namespace NoticeSystem
{
    public partial class MainForm : Form
    {
        UdpClient udpClient = new UdpClient();
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void btnClose_Click(object sender, EventArgs e)
        {
            udpClient.Close();
            Close();
        }
 
        private void btnSend_Click(object sender, EventArgs e)
        {
            Int32 port = 11000;
            IPAddress ip = IPAddress.Parse(txtStartIP.Text.Trim());
            IPEndPoint ipEndPoint = new IPEndPoint(ip,port);
            byte[] content = Encoding.ASCII.GetBytes(richText.Text);
            try
            {
                int count = udpClient.Send(content, content.Length, ipEndPoint);
                if (count > 0)
                {
                    MessageBox.Show("Message has been sent.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch
            {
                MessageBox.Show("Error occurs.", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
    }
}

Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!