udpclient发送和接收数据(统计)

这几天在解决一个统计的问题,由于数据量很大,直接对数据库操作已经不能再满足需求啦~所以决定用UDP发包来统计,再结合一点缓存技术,当达到一定值后再一并放入数据库,这样就很轻松的解决了数据库的性能瓶颈.
udp发送数据压力:10万条数据/<>1500ms。
关于UDP特点摘抄网络资料如下:
UDP(User Datagram Protocol)协议就是“用户数据报协议”,它是一种无连接的协议,无连接主要是和TCP协议相比较的。我们知道当利用TCP协议传送数据的时候,首先必须先建立连接(也就是所谓的握手)才可以传输数据。而当计算机利用UDP协议进行数据传输的时候,发送方只需要知道对方的IP地址和端口号就可以发送数据,而并不需要进行连接。当然如果你非要进行连接,通过Visual C#也是可以实现的,但前提是要确定连接的远程主机的端口号处于监听状态,否则程序会出现不必要的错误,但这是种画蛇添足的做法,不仅丢失了UDP协议的无连接传送数据的特点和优点,而且还给程序运行带来了不安定的因素。所以这种方法并不值得提倡。

由于UDP协议并不需要进行确定的连接,所以编写基于UDP协议的应用程序比起编写基于TCP协议的应用程序要简单些(程序中可以不需要考虑连接和一些异常的捕获工作)。但同时也给基于UDP协议编写的程序带来了一个致命的缺点,UDP由于不提供可靠数据的传输,当计算机之间利用UDP协议传送数据的时候,发送方只管发送数据,而并不确认数据是否被对方接收。这样就会导致某些UDP协议数据包在传送的过程中丢失,尤其网络质量不令人满意的情况下,丢失数据包的现象会更严重。这就是为什么在网络上传输重要数据不采用UDP协议的原因。

但是我们也不能因为这一个缺点就全面否定UDP协议,这是因为虽然利用UDP协议来传送安全性要求高的数据是不适合的,但对于那些不重要的数据,或者即使丢失若干数据包也不影响整体性的数据,如音频数据,视频数据等,采用UDP协议就是一个非常不错的选择。如目前网络流行的很多即时聊天程序,如OICQ和ICQ等,采用的就是UDP协议。同时虽然UDP协议无法保证数据可靠性,但具有对网络资源开销较小,数据处理速度快的优点,所以在有些对数据安全性要求不是很高的情况下,采用UDP协议也是一个非常不错的选择。

总结一下上面的内容,可见UDP是一种不面向连接的网络协议,既有其优点,也有其不足,具体如下:

1.基于UDP协议的网络应用程序,实现起来比较简单,并且基于UDP协议的网络应用程序在运行时,由于受到环境影响较小,所以不容易出错。

2.UDP协议占用网络资源较少,数据处理较快,所以在网络中传送对安全性要求不是十分高数据时,其优点比较明显。所谓对安全性要求不高的数据,是指那些不重要的数据,或者是即使丢失若干数据,也不影响其整体的数据,如音频数据等。目前很多流行的网络应用程序都是基于UDP协议的,如OICQ、ICQ等。

3.由于其不是面向连接的网络协议,其缺点也是非常明显的,有些时候甚至是致命的。因为使用UDP协议来传送数据,在数据发送后,在发送方并不确认对方是否接收到。这样就可能导致传送的数据在网络中丢失,尤其在网络条件并不很好的情况下,丢失数据包的现象就更多。所以传送重要数据一般不采用UDP协议。


测试代码:
接收端:
UDP(User Datagram Protocol)协议就是“用户数据报协议”,它是一种无连接的协议,无连接主要是和TCP协议相比较的。我们知道当利用TCP协议传送数据的时候,首先必须先建立连接(也就是所谓的握手)才可以传输数据。而当计算机利用UDP协议进行数据传输的时候,发送方只需要知道对方的IP地址和端口号就可以发送数据,而并不需要进行连接。当然如果你非要进行连接,通过Visual C#也是可以实现的,但前提是要确定连接的远程主机的端口号处于监听状态,否则程序会出现不必要的错误,但这是种画蛇添足的做法,不仅丢失了UDP协议的无连接传送数据的特点和优点,而且还给程序运行带来了不安定的因素。所以这种方法并不值得提倡。

由于UDP协议并不需要进行确定的连接,所以编写基于UDP协议的应用程序比起编写基于TCP协议的应用程序要简单些(程序中可以不需要考虑连接和一些异常的捕获工作)。但同时也给基于UDP协议编写的程序带来了一个致命的缺点,UDP由于不提供可靠数据的传输,当计算机之间利用UDP协议传送数据的时候,发送方只管发送数据,而并不确认数据是否被对方接收。这样就会导致某些UDP协议数据包在传送的过程中丢失,尤其网络质量不令人满意的情况下,丢失数据包的现象会更严重。这就是为什么在网络上传输重要数据不采用UDP协议的原因。

但是我们也不能因为这一个缺点就全面否定UDP协议,这是因为虽然利用UDP协议来传送安全性要求高的数据是不适合的,但对于那些不重要的数据,或者即使丢失若干数据包也不影响整体性的数据,如音频数据,视频数据等,采用UDP协议就是一个非常不错的选择。如目前网络流行的很多即时聊天程序,如OICQ和ICQ等,采用的就是UDP协议。同时虽然UDP协议无法保证数据可靠性,但具有对网络资源开销较小,数据处理速度快的优点,所以在有些对数据安全性要求不是很高的情况下,采用UDP协议也是一个非常不错的选择。

总结一下上面的内容,可见UDP是一种不面向连接的网络协议,既有其优点,也有其不足,具体如下:

1.基于UDP协议的网络应用程序,实现起来比较简单,并且基于UDP协议的网络应用程序在运行时,由于受到环境影响较小,所以不容易出错。

2.UDP协议占用网络资源较少,数据处理较快,所以在网络中传送对安全性要求不是十分高数据时,其优点比较明显。所谓对安全性要求不高的数据,是指那些不重要的数据,或者是即使丢失若干数据,也不影响其整体的数据,如音频数据等。目前很多流行的网络应用程序都是基于UDP协议的,如OICQ、ICQ等。

3.由于其不是面向连接的网络协议,其缺点也是非常明显的,有些时候甚至是致命的。因为使用UDP协议来传送数据,在数据发送后,在发送方并不确认对方是否接收到。这样就可能导致传送的数据在网络中丢失,尤其在网络条件并不很好的情况下,丢失数据包的现象就更多。所以传送重要数据一般不采用UDP协议。


测试代码:

接收端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            UdpClient listener = new UdpClient(8009); //实例化并绑定并监听本地端口
            IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.0.102"), 8003); //指定要接收的远程主机地址及端口
            Console.Write("开始侦听端口:/n");
            while (true) //循环监听
            {
                byte[] receiveArray = listener.Receive(ref server);//堵塞并接受远程主机发送过来的字节数据
                Console.WriteLine(Encoding.Default.GetString(receiveArray)); //打印
            }
            listener.Close();
        }
    }
}
/*后记:经过测试,发觉receive传递进去的IP地址及端口无论是多少,只要在发送端指定了发送到8009,就可以收到了。*/

发送端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress serverIP=IPAddress.Parse("192.168.0.102");
            IPEndPoint server = new IPEndPoint(serverIP, 8009); //示例化一个网络端点,即为要发送到哪里
            UdpClient udpClient = new UdpClient();
            Console.WriteLine("请输入您要发送的内容(/"Y/"退出):/n");
            for (int n = 0; n < 1000; n++)
            {
                string str = Console.ReadLine();
                if (str.ToLower() == "y")
                    break;
                byte[] sendMessage = Encoding.Default.GetBytes(str); //要发送的数据必须是字节类型
                udpClient.Send(sendMessage, sendMessage.Length, server);//发送
                Console.WriteLine("消息已经成功发送,请再次输入您要发送的内容,'Y'则退出!/n");


            }
            udpClient.Close();
        }
    }
}

 

小知识:
当接收端运行后,如何查看指定的端口是否已经在监听状态了呢,只需cmd以下语句
netstat -a -n -o
若只看udp连接
netstat -a -n -o |FIND "UDP"
若只看某个端口
netstat -a -n -o |FIND "8009"
延伸:
到处连接信息:netstat -a -n -o >D:/TEST.TXT
查看接收和发送数据包统计:netstat -a -s

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值