UDP发送与接收数据

计算机基础网络概念

  • 计算机通信:
    1.网线
    2.网卡
    3.唯一识别的MAC地址,通过MAC获取ip,使用ip地址作为标识。

  • IP地址以及IP协议
    规定网络地址的协议叫IP协议,它定义的地址成为IP地址。
    IP地址通常写成四段十进制数。
    IP范围0.0.0.0–255.255.255.255

  • Windows中查看网卡信息
    win+R输入cmd进行命令指示窗口,输入ipconfig即可。

  • Linux查看网卡信息
    ip -a 或者ifconfig

IP地址的分类
IP地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机。二者是主从关系.

IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。 全0和全1的都保留不用。

  • A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
  • B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
  • C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
  • D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
  • E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。

网络分类

按网络的地理位置分类:

  1. 局域网(Local Area Network,简称LAN)一般限定在较小的区域内,小于10km的范围,通常采用有线的方式连接起来。
  2. 城域网(Metropolis Area Network,简称MAN)
  3. 广域网(Wide Area Network,简称WAN)网络跨越国界、洲界,甚至全球范围。 目前局域网和广域网是网络的热点。局域网是组成其他两种类型网络的基础,城域网一般都加入了广域网。广域网的典型代表是Internet网。

局域网中的机器想要访问局域网外的机器,需要通过网关访问。
交换机是为了解决多台机器之间的通信问题。

端口介绍

端口分类

1.知名端口(范围0-1023)

  • 80端口分配给HTTP服务
  • 21端口分配给FTP服务
    2.动态端口(范围1024-65535)
    在同一时间只会有一个程序占用一个端口,不可能存在同一台计算机上的一个端口被两个程序占用的情况。

公网IP、内网IP、NAT转换

公网IP是指互联网IP地址。
内网IP是指局域网IP地址。

公网IP和内网IP的关系

由于IPV4的IP地址数量有限制,每一台电脑是不可能都会分配一个公网IP地址,这样明显IPV4的IP地址不够分配,于是就有了这样的策略:对于公司而言,每个公司都会有一个属于自己公司的内网。将方圆几里的计算机、外接设备和数据库等互联网互相连接起来组成计算机通信网。

内网IP的作用:
1、内网主要作用有哪些?
• 共享传输信道:简单地理解就是不需要每台电脑一个外网IP地址。
• 传输速率高:内网之间的电脑因为没有外网网络拓扑的复杂性,所以互相通信的网络可以很快。
• 误码率低:因为通信距离很近,所以误码率很低,换句话说就是网络很稳定。

2、公司的内网是如何实现内网IP地址分配和管理的?
假如我们给公司A分配了一个IP=192.168.1.1。我们把这个IP作为公司A内网的网关吧。 在公司A的内网里面有3台电脑,如果这三台电脑要上网的话,我们可以给这三台电脑随便分配三个IP(请注意,这三个IP不是去申请的,而且我自己随意给它分配的)。分别分配电脑A = 192.168.1.2 电脑B = 192.168.1.3 电脑C = 192.168.1.4。

NAT技术–实现内网电脑访问外网的能力

NAT(Network Address Translation,网络地址转换)技术,NAT将无法在互联网上使用的私有IP地址映射成可以在互联网上使用的合法IP地址。而全局地址,是指合法的IP地址。
映射方式包括基本网络地址转换与网络地址端口转换(NAPT),其中NAPT用的比较多。这时我们就用到了路由器,路由器负责将内网的IP与端口号映射到公网的IP与端口号,并以该IP与端口号与外网进行通讯,并作为中间桥梁控制其间的数据传输。

TCP/IP协议

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。

TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
在这里插入图片描述
应用层:
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

传输层:
提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。

网络层 :
负责相邻计算机之间的通信。其功能包括三方面。
一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。

二、处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。

三、处理路径、流控、拥塞等问题。

网络接口层:
这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

在TCP/IP协议中,其各层之间的通信机制,大致如下图所示:
在这里插入图片描述

socket的简介

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
在这里插入图片描述

UDP发送以及接收数据

udp发送数据

实现步骤:
• 1.创建套接字
• 2.使用套接字收/发数据
• 3.关闭套接字

import socket

def main():
#创建套接字
    Udp_socket=socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)

    while True:
        send_data=input('请输入你要发送的信息:')
        Udp_socket.sendto(send_data.encode('utf-8'),('127.0.0.1',8081))
        if send_data == 'q':
            break

    Udp_socket.close()

if __name__ == '__main__':
    main()

udp接收数据

实现步骤:
• 1.创建套接字
• 2.绑定本地信息(IP和端口)
• 3.接受数据
• 4.打印数据
• 5.关闭套接字

import socket

def main():
    Udp_cocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    Udp_cocket.bind(('127.0.0.1',8081))

    while True:
        data = Udp_cocket.recvfrom(1024) #每次接收的最大字节
        print(data[0].decode('utf-8'))
        if data[0].decode('utf-8') == 'bye':
            break
        # print(data[1].decode('utf-8'))
    Udp_cocket.close()

if __name__ == '__main__':
    main()

udp聊天器

• 1.创建套接字 套接字是可以同时收发数据的
• 2.发送数据
• 3.接收数据

import socket

def send_data(udp_socket):
    send_data = input("请输入要发送的数据:")
    udp_socket.sendto(send_data.encode('utf-8'), ("127.0.0.1", 8980))


def recv_data(udp_socket):
    data = udp_socket.recvfrom(1024)
    print(data[0].decode('utf-8'))


def main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定
    udp_socket.bind(('127.0.0.1', 8980))

    while True:
        # 发送数据
        send_data(udp_socket)
        # 接收数据
        recv_data(udp_socket)


if __name__ == '__main__':
    main()
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用C#编写程序来发送接收UDP数据。下面是一个简单的示例代码,演示了如何发送接收UDP数据包。 首先,你需要引用System.Net命名空间,它包含了用于UDP通信的相类。 ```csharp using System; using System.Net; using System.Net.Sockets; class Program { static void Main() { // 发送数据 UdpClient udpClient = new UdpClient(); byte[] sendData = System.Text.Encoding.ASCII.GetBytes("Hello, UDP Server!"); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("服务器IP"), 12345); udpClient.Send(sendData, sendData.Length, serverEndPoint); // 接收数据 UdpClient receivingUdpClient = new UdpClient(12345); // 绑定本地端口 IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] receivedData = receivingUdpClient.Receive(ref remoteEndPoint); string receivedMessage = System.Text.Encoding.ASCII.GetString(receivedData); Console.WriteLine("Received: " + receivedMessage); udpClient.Close(); receivingUdpClient.Close(); } } ``` 在上面的代码中,你需要将"服务器IP"替换为实际的服务器IP地址。程序首先创建一个`UdpClient`对象,该对象用于发送UDP数据包。使用`Encoding.ASCII.GetBytes`将消息转换为字节数组,并通过`Send`方法将数据包发送到指定的服务器端IP和端口。 然后,代码创建另一个`UdpClient`对象,用于接收UDP数据包。使用指定的本地端口号来监听接收的数据包。使用`Receive`方法接收数据,并使用`Encoding.ASCII.GetString`将接收到的字节数组转换为字符串。 请注意,这只是一个简单的示例,你需要根据你的实际需求进行适当的修改和错误处理。 希望这能帮到你!如果有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值