C#UDP字节流的传输与接收问题,拜托答的好我就加分

C#UDP字节流的传输与接收问题,拜托答的好我就加分,第1张

我举个例,是控制台程序哈,请根据需要修改

服务器端发送

using System;
using SystemNet;
using SystemNetSockets;
using SystemText;
class Program 
{
    private const int sendPort = 11000; //端口
 
    static void Main(string[] args) 
    {
        Socket s = new Socket(AddressFamilyInterNetwork, SocketTypeDgram,
            ProtocolTypeUdp);
        IPAddress broadcast = IPAddressParse("1921681255"); //广播地址
        byte[] sendbuf = {0x01, 0xB1, 0x00}; //要发送的数据
        IPEndPoint ep = new IPEndPoint(broadcast, sendPort);
        sSendTo(sendbuf, ep); //发送
        ConsoleWriteLine("Message sent to the broadcast address");
    }
}

客户端接收

using System;
using SystemNet;
using SystemNetSockets;
using SystemText;
public class UDPListener
{
    private const int listenPort = 11000; //监听端口
    private const byte[] code = { 0x01, 0xB1, 0x00 }; // 响应指定的数值
    private static void StartListener() 
    {
        bool done = false;
        
        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddressAny,listenPort);
        try 
        {
            while (!done) 
            {
                ConsoleWriteLine("Waiting for broadcast");
                byte[] bytes = listenerReceive( ref groupEP);// 接收数值
                // 将接收到的数据显示出来,这里请根据实际情况修改
                ConsoleWriteLine("Received broadcast from {0} :\n {1}\n",
                    groupEPToString(),
                    EncodingASCIIGetString(bytes,0,bytesLength));
                // 判断是否指定的数值
                if (bytes == code)
                {
                    Socket s = new Socket (AddressFamilyInterNetwork, SocketTypeDgram, ProtocolTypeUdp);
                    byte byte1 = 0;// 变量请根据需要赋值
                    byte byte2 = 0;
                    byte byte3 = 0;
                    byte[] sendbuf = { 0x01, 0xB1, 0x00, byte1, byte2, byte3 };
                    sSendTo (sendbuf, groupEP); // 发送给服务器
                }
            }
            
        } 
        catch (Exception e) 
        {
            ConsoleWriteLine(eToString());
        }
        finally
        {
            listenerClose();// 关闭
        }
    }
    public static int Main()
    {
        StartListener ();
        return 0;
    }
}

按流向分(站在程序角度考虑)
输入流(input)
输出流(output)
按类型分:
字节流(InputStream/OutputStream)
任何文件都可以通过字节流进行传输。
字符流(Reader/Writer)
非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。
节点流(低级流:直接跟输入输出源对接)
FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter
处理流(高级流:建立在低级流的基础上)
转换流:InputStreamReader/OutputStreamWriter,字节流转字符流/字符流转字节流
缓冲流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可对节点流经行包装,使读写更快
计算机俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件系统和软件系统所组成,没有安装任何软件的计算机称为裸机。
可分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类,较先进的计算机有生物计算机、光子计算机、量子计算机、神经网络计算机。蛋白质计算机等。
当今计算机系统的运算速度已达到每秒万亿次,微机也可达每秒几亿次以上,使大量复杂的科学计算问题得以解决。例如:卫星轨道的计算、大型水坝的计算、24小时天气预报的计算等,过去人工计算需要几年、几十年,而现在用计算机只需几天甚至几分钟就可完成。
科学技术的发展特别是尖端科学技术的发展,需要高度精确的计算。计算机控制的导d之所以能准确地击中预定的目标,是与计算机的精确计算分不开的。一般计算机可以有十几位甚至几十位(二进制)有效数字,计算精度可由千分之几到百万分之几,是任何计算工具所望尘莫及的。
随着计算机存储容量的不断增大,可存储记忆的信息越来越多。计算机不仅能进行计算,而且能把参加运算的数据、程序以及中间结果和最后结果保存起来,以供用户随时调用;还可以对各种信息(如视频、语言、文字、图形、图像、音乐等)通过编码技术进行算术运算和逻辑运算,甚至进行推理和证明。
计算机内部 *** 作是根据人们事先编好的程序自动控制进行的。用户根据解题需要,事先设计好运行步骤与程序,计算机十分严格地按程序规定的步骤 *** 作,整个过程不需人工干预,自动执行,已达到用户的预期结果。
超级计算机(supercomputers)通常是指由数百数千甚至更多的处理器(机)组成的、能计算普通PC机和服务器不能完成的大型复杂课题的计算机。超级计算机是计算机中功能最强、运算速度最快、存储容量最大的一类计算机,是国家科技发展水平和综合国力的重要标志。
超级计算机拥有最强的并行计算能力,主要用于科学计算。在气象、军事、能源、航天、探矿等领域承担大规模、高速度的计算任务。
在结构上,虽然超级计算机和服务器都可能是多处理器系统,二者并无实质区别,但是现代超级计算机较多采用集群系统,更注重浮点运算的性能,可看着是一种专注于科学计算的高性能服务器,而且价格非常昂贵。
一般的超级计算器耗电量相当大,一秒钟电费就要上千,超级计算器的CPU至少50核也就是说是家用电脑的10倍左右,处理速度也是相当的快,但是这种CPU是无法购买的,而且价格要上千万。

这个要看你的源sftp服务器使用的是什么了,如果是linux之类的,可以所以sftp得命令行工具,如果是serv-u之类的windows的,则需要第三方工具了。我用的是小鸟云服务器,感觉挺好的。

Socket套接字,是由系统提供用于网络通信的技术( *** 作系统给应用程序提供的一组API叫做Socket API),是基于TCP/IP协议的网络通信的基本 *** 作单元。基于Socket套接字的网络程序开发就是网络编程。
socket可以视为是应用层和传输层之间的通信桥梁;
传输层的核心协议有两种:TCP,UDP;socket API也有对应的两组,由于TCP和UDP协议差别很大,因此,这两组API差别也挺大。
分类:
Socket套接字主要针对传输层协议划分为如下三类:
流套接字:使用传输层TCP协议
TCP,即Transmission Control Protocol(传输控制协议),传输层协议;
TCP的特点:
有连接:像打电话,得先接通,才能交互数据;
可靠传输:传输过程中,发送方知道接收方有没有收到数据(打电话就是可靠传输);
面向字节流:以字节为单位进行传输(非常类似于文件 *** 作中的字节流);
全双工:一条链路,双向通信;
有接收缓冲区,也有发送缓冲区。
大小不限
对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。
数据报套接字:使用传输层UDP协议
UDP,即User Datagram Protocol(用户数据报协议),传输层协议。
UDP的特点:
无连接:像发微信,不需要接通,直接就能发数据;
不可靠传输:传输过程中,发送方不知道接收方有没有收到数据(发微信就是不可靠传输);
面向数据报:以数据报为单位进行传输(一个数据报都会明确大小)一次发送/接收必须是一个完整的数据报,不能是半个,也不能是一个半;
全双工:一条链路,双向通信;
有接收缓冲区,无发送缓冲区;
大小受限:一次最多传输64k;
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。
原始套接字
原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。
二、UDP数据报套接字编程
UDPSocket中,主要涉及到两类:DatagramSocket、DatagramPacket;
DatagramSocket API
DatagramSocket 创建了一个UDP版本的Socket对象,用于发送和接收UDP数据报,代表着 *** 作系统中的一个socket文件,( *** 作系统实现的功能–>)代表着网卡硬件设备的抽象体现。
DatagramSocket 构造方法:
方法签名 方法说明
DatagramSocket() 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)
DatagramSocket 方法:
方法签名 方法说明
void receive(DatagramPacket p) 从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacket p) 从此套接字发送数据报包(不会阻塞等待,直接发送)
void close() 关闭此数据报套接字
DatagramPacket API
代表了一个UDP数据报,是UDP Socket发送和接收的数据报,每次发送/接收数据报,都是在传输一个DatagramPacket对象。
DatagramPacket 构造方法:
方法签名 方法说明
DatagramPacket(byte[] buf, int length) 构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 构造一个DatagramPacket以用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从0到指定长度(第二个参数length)。address指定目的主机的IP和端口号
DatagramPacket 方法:
方法签名 方法说明
InetAddress getAddress() 从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort() 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData() 获取数据报中的数据
构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。
InetSocketAddress API
InetSocketAddress ( SocketAddress 的子类 )构造方法:
方法签名 方法说明
InetSocketAddress(InetAddress addr, int port) 创建一个Socket地址,包含IP地址和端口号
示例1:写一个简单的客户端服务程序,回显服务(EchoSever)
在这里插入描述
构建Socket对象有很多失败的可能:
端口号已经被占用,同一个主机的两个程序不能有相同的端口号(这就好比两个人不能拥有相同的电话号码);
此处,多个进程不能绑定同一个端口号,但是一个进程可以绑定多个端口,(这就好比一个人可以拥有多个手机号),一个进程可以创建多个Socket对象,每个Socket都绑定自己的端口。
每个进程能够打开的文件个数是有上限的,如果进程之间已经打开了很多文件,就可能导致此时的Socket文件不能顺利打开;
在这里插入描述
这个长度不一定是1024,假设这里的UDP数据最长是1024,实际的数据可能不够1024
在这里插入描述
这里的参数不再是一个空的字节数组了,response是刚才根据请求计算的得到的响应,是非空的,DatagramPacket 里面的数据就是String response的数据。
responsegetBytes()length:这里拿到的是字节数组的长度(字节的个数),而responselength得到的是字符的长度。
五元组
一次通信是由5个核心信息描述的:源IP、 源端口、 目的IP、 目的端口、 协议类型。
站在客户端角度:
源IP:本机IP;
源端口:系统分配的端口;
目的IP:服务器的IP;
目的端口:服务器的端口;
协议类型:TCP;
站在服务器的角度:
源IP:服务器程序本机的IP;
源端口:服务器绑定的端口(此处手动指定了9090);
目的IP:包含在收到的数据报中(客户端的IP);
目的端口:包含在收到的数据报中(客户端的端口);
协议类型:UDP;

Step1:用户在地址栏输入一个网址,然后点击回车键;
Step2:浏览器与服务器建立TCP连接;
Step3:浏览器将用户的事件按照>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10602119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存