[转贴]基于UDP、TCP协议的C#网络编程之一

转自新浪"烈·翼·焚·天"的博客,原文地址:http://blog.sina.com.cn/s/blog_4c459776010009bp.html

  写这篇之前,先简单介绍一下TCP、UDP协议,深的讲不出来,有不明白的请问我秘书Dawnh同学。

    TCP(传输控制协议)是 TCP/IP 协议栈中的传输层协议,它通过序列确认以及包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与IP协议相结合, TCP组成了因特网协议的核心。

    UDP(用户数据报协议)是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP协议基本上是 IP 协议与上层协议的接口。UDP协议适用端口分辨运行在同一台设备上的多个应用程序。

    C#中,已将TCP,UDP,SMTP等协议封装为相应的类型库,提供了一系列方法供程序员进行操作,可以简单的理解为,基于TCP的编程就好象通电话,我拨打贱人甲电话,贱人甲必须按下接听键,我们之间才能建立起有效的连接,而基于UDP的编程就好象是收音机广播,我这头只管播,对面谁在听或者是不是收到我并不关心。TCP、UDP同属于高层协议,复杂程度是大大不如Socket编程的。

    下面我准备写两个例子,一个用UDP,一个用TCP,TCP比较好理解,UDP实际上也不麻烦,但是从网上找资料看你会看的非常晕,MSDN的各种Sample也统统放到一个类里写,效果并不好,我稍微一总结,先写个基于UDP的例子。

   示例一:UDP

    窗体:

   

   

    Form1做为服务器端,按下Send,将文本框的值发送出去,Form1做为客户端,接收信息并加入到ListBox控件中。

      Form1:


public partial class Form1 : Form
    {
        UdpClient uc; //声明UDPClient
        public Form1()
        {           
            uc = new UdpClient(); //初始化
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {           
            string temp = this.textBox1.Text; //保存TextBox文本

           //将该文本转化为字节数组
            byte[] b = System.Text.Encoding.UTF8.GetBytes(temp);

           //向本机的8888端口发送数据
            uc.Send(b, b.Length,Dns.GetHostName(),8888);
        }
    }

      Form2:


public partial class Form2 : Form
    {
        UdpClient uc = null; //声明UDPClient
        public Form1()
        {

           //屏蔽跨线程改控件属性那个异常
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();

           //注意此处端口号要与发送方相同
            uc = new UdpClient(8888);

            //开一线程
            Thread th = new Thread(new ThreadStart(listen));

           //设置为后台
            th.IsBackground = true;
            th.Start();
        }
        private void listen()
        {

           //声明终结点
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.0.10"),8888);
            while (true)
            {

               //获得Form1发送过来的数据包
                string text = System.Text.Encoding.UTF8.GetString(uc.Receive(ref iep));

               //加入ListBox
                this.listBox1.Items.Add(text);
            }
        }
    }

    需要注意的地方非常之多,别看就这么几行,先看Form1中的UdpClient声明,这里使用了无参的构造函数uc = new UdpClient(); 我们写基于TCP的程序可以知道,TcpClient声明同时直接指出其端口是很方便的,也是必然的,不指定端口你上哪收数据去?因为UDP是一种无连接的传输层协议,想给谁发就给谁发,所以如果我们这么声明了UdpClient,但是接收方如果想收到数据包,就必须建立基于发送方发送数据端口的UdpClient(见Form2),这么说有点乱,接着往下看。当我们声明了uc = new UdpClient(); 那下面的写法就相对固定了,在Send数据的时候,需要指明其目标计算机,以及将要发送的端口,例如示例中的uc.Send(b, b.Length,Dns.GetHostName(),8888);Send有很多重载的方法,如果你想这么写uc.Send(b, b.Length);那就必须在Send之前在UdpClient与目标计算机之间做一下连接,否则无法发送,我们可以这么写:


uc = new UdpClient(); 

uc.Connect(IPAddress.Parse("192.168.0.10"), 8888);

.....

uc.Send(b, b.Length);

     这里注意,IP地址跟端口号可以随便写,只要对方监听着你的这个端口,说监听有点小错,UDP并不需要监听,姑且这么说,形象一点。

     另外,很多人遇到这么个问题,无论在TCP还是UDP中,很多时候因为编码问题,接收到以字节数组发送的中文消息,还原后出现乱码,这个问题的解决办法是发送方与接收方都使用同一种Encoding,发送方用UTF-8.GetBytes,接收方也同样使用UTF-8.GetString这个方法便可传递中文,网上鸟多,墨迹半天也解决不了,汗个。

     再来看Form2,与Form1相反,在Form2中实例化UdpClient时,需要指明其端口,因为我们要捕获发送过来的消息,注意这两句话:


IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.0.10"),8888);

.........
string text = System.Text.Encoding.UTF8.GetString(uc.Receive(ref iep));

     网上对这个貌似还是有点误解,很多人说,这里的IPEndPoint的端口号如果随便指定,也可以收到发送过来的消息,但是就是不知道为什么,我写的更简单:

    


IPEndPoint iep = null;

.........
string text = System.Text.Encoding.UTF8.GetString(uc.Receive(ref iep));

     看出问题来了吧,关键是uc.Receive方法里的ref参数,ref关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。所以你只要扔给它一个值就得了,管他什么端口号,况且端口早在声明UdpClient的时候就指定好了。

     有点长,分两截。

 

 

yjmyzz: https://cid-2959920b8267aaca.skydrive.live.com/self.aspx/WPF/UDP^_WPF^_Demo.rar wpf版的udp小示例

时间: 2024-10-31 20:54:10

[转贴]基于UDP、TCP协议的C#网络编程之一的相关文章

[转贴]基于UDP、TCP协议的C#网络编程之二

转自新浪"烈·翼·焚·天"的博客,原文地址:http://blog.sina.com.cn/s/blog_4c459776010009c3.html~type=v5_one&label=rela_nextarticle 第二截,讲讲基于TCP协议的网络编程,与UDP不同的是,基于TCP协议的编程的服务器端有一个监听对象:TcpListener,它负责监听来自客户端的消息并处理,并且必须在保持连接的情况下与客户端保持互动,下面举个例子,TCP不怎么复杂,只是综合要求较高,如果想编

基于TCP/IP协议的C++网络编程(API函数版)

源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量--获得WINSOCK版本--加载WINSOCK库--初始化--创建套接字 --设置套接字选项--关闭套接字--卸载WINSOCK库--释放所有资源 整个程序架构分为两大部分,服务器端客户端. 服务器SOCKET程序流程: socket()→bind()→listen→accept()→recv()/send()→closesocket() 客户端

基于OAuth安全协议的Java应用编程

OAuth 协议致力于使网站和应用程序(统称为消费方 Consumer)能够在无须用户透露其认证信息的情况下,通过 API 访问该用户在服务提供方(Service Provider)那里的受保护资源.更一般地说,OAuth 为 API 认证提供了一个可自由实现且通用的方法.目前互联网很多服务如 Open API 等都提供了 OAuth 认证服务,OAuth 标准也逐渐成为开放资源授权的标准.本文讨论如何使用 Google Code 上提供的 OAuth Java 库来实现基于 OAuth 认证的

使用C#通过modbus TCP协议实现对可编程马达控制器的控制

问题描述 各位大神,我现在在用WPF/C#做一个客户端的界面,实现通过modbustcp的协议对我的马达控制器的控制,但是好像并没有找到合适的modbustcp的动态链接库.我利用的modbus_vc.dll可以连接上设备,但是发送十进制的指令并没有回应.十进制的指令应该是没有问题的,我用modbus的第三方软件测试过的.我不知道是我的dll动态链接库有问题,还是我的指令发送有错误.以下是我的C#程序.请问我错在哪个环节了,请问有大牛可以给我指点一下这个dll动态链接库里的函数的参数都是什么意思

TCP协议详解(理论篇)

本文章摘自红黑联盟 http://www.2cto.com/net/201208/149347.html 供大家学习交流 TCP协议详解 1.    与UDP不同的是,TCP提供了一种面向连接的.可靠的字节流服务.面向连接比较好理解,就是连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话.助于可靠性,TCP协议中涉及了诸多规则来保障通信链路的可靠性,总结起来,主要有以下几点:       (1)应用数据分割成TCP认为最适合发送的数据块.这部分是通过"MSS"(最大数据包长

linux网络编程之TCP/IP基础(五) 分析一帧基于UDP的TFTP协议帧

下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好 说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网 首部 0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00 IP首部 0000: 45 00 0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8 0020: 00 01 UDP首部 0020: 05 d4 00 45

计算机网络课设之基于UDP协议的简易聊天机器人

前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C语言的socket编程我基本没有接触过,顶多对java网络编程有一点涉猎.下面我将自己所学的知识做了一个总结,希望可以对想要去接触socket(网络)编程的同学有一个帮助,当然想要学好网络编程肯定是离不开几本书的支撑的,这篇文章主要通过一个机器人聊天的案例帮大家入下门. 注意:想要成功运行的前提条件

基于UDP高性能传输协议UDT doc翻译(一)

原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd                                                       UDT文档阅读理解 一.  概述 UDT是一个高性能的基于UDP的数据传输协议,它是为支持高速广域网上海量数据传输而设计,为解决TCP的效率和公平问题,同时提供可靠的数据流和报文传输. UDT是C++库,几乎类同于BSD socket APIs. UDT是多线

Java基于UDP协议实现简单的聊天室程序_java

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆.  先看一下效果:   实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理.  "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着.  看一下代码实现:  1.首先是消息服务器的实现,功能很简单:•将客户端的信息(进