C# UDP 连接通信 简单示例

Udp.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace udp
{
    public delegate void UdpEventHandler(object sender, UdpEventArgs e);

    public abstract class Udp : IUdp
    {
        public event UdpEventHandler Received;

        private int _port;
        private string _ip;
        public bool IsListening { get; private set; }
        private Socket _sck;

        public Socket UdpSocket
        {
            get { return _sck; }
        }
        public string Ip
        {
            get { return _ip; }
            set { _ip = value; }
        }
        public int Port
        {
            get { return _port; }
            set
            {
                if (value < 0)
                    value = 0;
                if (value > 65536)
                    value = 65536;
                _port = value;
            }
        }

        public Udp()
        {
            _sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _sck.ReceiveBufferSize = UInt16.MaxValue * 8;
            //log
            System.Diagnostics.Trace.Listeners.Clear();
            System.Diagnostics.Trace.AutoFlush = true;
            System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener("log.txt"));
        }

        public void Listening()
        {
            IPAddress ip = IPAddress.Any;
            try
            {
                if (this._ip != null)
                    if (!IPAddress.TryParse(this._ip, out ip))
                        throw new ArgumentException("IP地址错误", "Ip");
                _sck.Bind(new IPEndPoint(ip, this._port));

                UdpState state = new UdpState();
                state.Socket = _sck;
                state.Remote = new IPEndPoint(IPAddress.Any, 0);
                _sck.BeginReceiveFrom(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.Remote, new AsyncCallback(EndReceiveFrom), state);
                IsListening = true;
            }
            catch (ArgumentException ex)
            {
                IsListening = false;
                System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + "\t" + ex.Message);
                throw ex;
            }
            catch (Exception ex)
            {
                IsListening = false;
                System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + "\t" + ex.Message);
                throw ex;
            }
        }
        private void EndReceiveFrom(IAsyncResult ir)
        {
            if (IsListening)
            {
                UdpState state = ir.AsyncState as UdpState;
                try
                {
                    if (ir.IsCompleted)
                    {
                        int length = state.Socket.EndReceiveFrom(ir, ref state.Remote);
                        byte[] btReceived = new byte[length];
                        Buffer.BlockCopy(state.Buffer, 0, btReceived, 0, length);
                        OnReceived(new UdpEventArgs(btReceived, state.Remote));
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + "\t" + ex.Message+ex.Source);
                }
                finally
                {
                    state.Socket.BeginReceiveFrom(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.Remote, new AsyncCallback(EndReceiveFrom), state);
                }
            }
        }

        private void OnReceived(UdpEventArgs e)
        {
            if (this.Received != null)
            {
                Received(this, e);
            }
        }

        public void Send(byte[] bt, EndPoint ep)
        {
            if (_sck == null) return;
            try
            {
                this._sck.SendTo(bt, ep);
            }
            catch (SocketException ex)
            {
                System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + "\t" + ex.Message);
                throw ex;
            }
        }

        public void Dispose()
        {
            if (_sck == null) return;

              using (_sck) ;
            //this.IsListening = false;
            //this._sck.Blocking = false;
            //this._sck.Shutdown(SocketShutdown.Both);
            //this._sck.Close();
            //this._sck = null;
        }

    }
}

IUdp.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace udp
{
    public interface IUdp : IDisposable
    {
        event UdpEventHandler Received;

        void Send(byte[] bt, EndPoint ep);

        Socket UdpSocket { get; }
    }
}

UdpEventArgs.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace udp
{
    public class UdpEventArgs : EventArgs
    {
        private EndPoint _remote;

        private byte[] _rec;

        public byte[] Received
        {
            get { return _rec; }
        }
        public EndPoint Remote
        {
            get { return _remote; }
        }

        public UdpEventArgs(byte[] data, EndPoint remote)
        {
            this._remote = remote;
            this._rec = data;
        }
    }
}

UdpState.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace udp
{
    internal class UdpState
    {
        public byte[] Buffer;
        public EndPoint Remote;
        public Socket Socket;

        public UdpState()
        {
            Buffer = new byte[65536];
        }
    }
}

Client

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using udp;
namespace client
{
    class Program
    {
        private const string _serverIp = "127.0.0.1";
        private const int _serverPort = 8000;

        static void Main(string[] args)
        {
            Client client = new Client();
            client.ep = new IPEndPoint(IPAddress.Parse(_serverIp), _serverPort);
            client.Listening();
            client.Received += new UdpEventHandler(client_Received);
            while (true)
            {
                string tmp = Console.ReadLine();
                for (int i = 0; i < 10; i++)
                {
                    byte[] bt = Encoding.Default.GetBytes(tmp + i);
                    System.Threading.Thread t = new System.Threading.Thread(() =>
                    {
                        client.Send(bt, client.ep);
                    });
                    t.Start();
                }
                client.Dispose();
            }
        }

        static void client_Received(object sender, UdpEventArgs e)
        {
            IPEndPoint ep = e.Remote as IPEndPoint;
            string tmpReceived = Encoding.Default.GetString(e.Received);
            Console.WriteLine(ep.Address.ToString() + ":" + ep.Port + "--> " + tmpReceived);
        }
    }

    public class Client : Udp
    {
        public EndPoint ep;
        public Client()
        {

        }
    }
}

Server

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net.Sockets;
using System.Net;
using udp;

namespace server
{
    class Program
    {
        static Server server = new Server();
        static void Main(string[] args)
        {
            server.Port = 8000;
            server.Listening();
            if (server.IsListening)
            {
                server.Received += new UdpEventHandler(server_Received);
            }
            Console.ReadKey();
        }

        static void server_Received(object sender, UdpEventArgs e)
        {
            IPEndPoint ep = e.Remote as IPEndPoint;
            string tmpReceived = Encoding.Default.GetString(e.Received);
            Console.WriteLine(ep.Address.ToString() + ":" + ep.Port + "--> " + tmpReceived);
            ///自动回复
            server.Send(Encoding.Default.GetBytes("服务器已收到数据:‘" + tmpReceived + "‘,来自:‘" + ep.Address.ToString() + ":" + ep.Port + "’"), ep);
        }

    }
    public class Server : Udp
    {
        private EndPoint ep;
        public Server()
        {
        }
    }
}

源码文件

时间: 2024-10-11 13:48:27

C# UDP 连接通信 简单示例的相关文章

SQL左连接、右连接和内连接的简单示例

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接) 只返回两个表中联结字段相等的行:举例如下: -------------------------------------------- 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录

C# 如何实现简单的Socket通信(附示例)

上周由于有个项目需要用到网络通信这块,然后就花了点时间研究了一下,本来想上周就写出来的,但是突然要忙,所以等到现在. 话说对于网络通信,以前写C++的时候,天天面对着线程和Socket,所以换成C#也就没那么怕了,虽然C++下也没有掌握的多好,但毕竟只是一个小Demo,只作为了解一下过程. 自己写了一个服务端和一个客户端,刚开始比较简单,只是能达到连通,收发信息的目的,但是很粗糙.而后稍加改进呢~加上了多线程,所以能感觉更科学一些,不过自己真的很菜,代码写的不是很好看,下面分两个版本给大家表出来

高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2

HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节:HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中. 为了让使用者能方便快速地学习和使用 HP-S

高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1 发布

HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节:HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中. 为了让使用者能方便快速地学习和使用 HP-S

NetworkComms V3 之支持TCP连接和UDP连接

NetworkComms V3 无缝的支持TCP连接和UDP连接. 您可以很容易的创建这两种连接 //创建一个连接信息对象 ConnectionInfo connInfo = new ConnectionInfo("192.168.0.1", 10000); //创建一个TCP连接 Connection newTCPConn = TCPConnection.GetConnection(connInfo); //创建一个UDP连接 Connection newUDPConn = UDPC

JAVA套接字(Socket)101七天系列—第四天【一个简单示例】

一个简单示例  1. 背景 我们将在本部分讨论的示例将阐明在 Java 代码中如何使用 Socket 和 ServerSocket.客户机用Socket 连接到服务器.服务器用 ServerSocket 在端口 3000 侦听.客户机请求服务器 C: 驱动器上的文件内容. 为清楚起见,我们把示例分解成客户机端和服务器端.最后我们将把它们组合起来以使您能看到整体模样. 我们在使用 JDK 1.2 的 IBM VisualAge for Java 3.5 上开发这些代码.要自己创建这个示例,您应有完

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit

udp 双机通信(服务器循环检测)2

此文摘自:http://blog.csdn.net/qinpeng100423/article/details/8980423,谢谢了 自己上一篇写的udp通信,只能运行一次,参考了这位博主的,只是把receive的方法处改为循环,这样即可实现服务器循环检测,然后接受数据和回复 受到项目要求,将文件分离,读者引用该类,实例化调用方法即可. 一. UDP协议定义 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP