zoukankan      html  css  js  c++  java
  • 网络通信—udp使用领悟

    一 了解TCP与UDP协议区别

    TCP(传输控制协议):是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。

    UDP(用户数据报协议):是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

    大家可能很模糊,就这样举个生动的例子来讲吧:

    tcp:一对一的信息传输机制,好比甲对乙打电话,必须保证两方面 一、有电话线,处于连接状态  二、双方一个打电话,一个接听 

    udp:一对多的信息传输机制,好比一是一个广播站,其他的是众多的收音机;他们之间没有发生连接,广播站只负责发出信号,收音机只是在连接时接收信号,需要确定两个因素 波段和收音机的信号接收地区(也即是指的是端口号)

    二  我做了一个小例子来体会这种信息传递机制

    重点区域代码实现:

          private void button1_Click(object sender, EventArgs e)
            {
                int s = Convert.ToInt32(textBox4.Text);
                UdpClient uc = new UdpClient(s);//确定广播发送站所处的地址(地区)


                IPEndPoint remoteIp = new IPEndPoint(IPAddress.Parse(textBox2.Text), Convert.ToInt32(textBox3.Text));//确定广播信息的波段(IPAddress.Parse(textBox2.Text), 以及收听所在地区 后面的端口号

                uc.Connect(remoteIp);//将广播发送站与所定义的广播信息波段、区域实现连接 达成传输层

                Byte[] sendBytes = Encoding.UTF8.GetBytes(textBox1.Text);
                uc.Send(sendBytes, sendBytes.Length);

                uc.Close();
            }

            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                while (true)//在这里建立一个死循环,保证始终在收听广播信息
                {
                    UdpClient uc = new UdpClient(Convert.ToInt32(textBox3.Text));//收音机在使用之前,必须确定了其所在地  确定只能接受所在所能收到的信号
                    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    //IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);// 在这里确定接收广播的波段,和所在地(空着或者与上述的所在扫地一样)

                    Byte[] receiveBytes;
                    string returnData;
                    receiveBytes = uc.Receive(ref RemoteIpEndPoint);  // 这里加 ref 的目的是 通过 udpClient.Receive() 这个函数,得到服务器主机的 ip 地址。
                    returnData = Encoding.UTF8.GetString(receiveBytes);

                    textBox5.Text += "\r\n"+"发送方的Ip地址是:" + RemoteIpEndPoint.Address + "\r\n" + "发送信息是:" + returnData;
                    uc.Close();//这个地方的作用是在下次调用这个udpclient时,及时将所使用端口,解散掉,不然出现报错,端口被一直占用
                }

    注意一下几个方面问题:

    一:使用完立刻关闭udpclient,否则在下次调用时出现端口被占用的错误提示

    二:在接收事件中用到一个死循环,保证及时接受信息

  • 相关阅读:
    window.setInterval
    用gcc/g++编译winsock程序
    Yii 三表关联 角色表、角色权限连接表、权限表
    访问CGI程序时不添加 /cgi-bin/ 目录也可访问
    Linux 目录递归赋权,解决 Linux权限不够
    Linux 下用C语言连接 sqlite
    ORACLE中添加删除主键
    Linux 杀死进程
    Oracle 查询重复数据
    exlipse php 插件安装地址
  • 原文地址:https://www.cnblogs.com/liuxiaowei0543/p/3120716.html
Copyright © 2011-2022 走看看