当前位置: 首页 > news >正文

网络编程01

1. 概念

通过网络,让两个主机之间能够进行通信,基于这样的通信完成一定的功能

只要满足进程不同即可,即使是同一个主机,只要是不同的进程,基于网络完成编程

进行网络编程时,需要操作系统提供一组API,通过这些API才能完成编程

API可以认为是应用层和传输层之间交互的路径(Socket API)

通过这套API可以完成不同主机之间,不同系统之间的网络通信

传输层,提供的网络协议,主要是 TCP 和 UDP

这两个协议的特性(工作原理)差异很大,使用这两个协议进行网络编程时,存在一定的差异

系统分别提供了两套 API

2. TCP 和 UDP 的区别

1)TCP 是有连接的,UDP 是无连接的

(连接是抽象的概念)

连接的本质就是建立连接的双方,各自保存对方的信息

两台计算机建立连接,就是双方彼此保存了对方的关键信息

TCP 想要通信,需要先建立连接;如果对方拒绝,通信无法完成

UDP 想要通信,直接发送数据即可,不需要对方的同意,UDP 自身也不会保存对方的信息

UDP 自己不知道对方的信息,但程序员要知道。UDP 本身不保存,但调用UDP SocketAPI的时候要把对方的位置传送过去

2)TCP 是可靠传输,UDP 是不可靠传输

网络上进行通信的时候,A -> B发送一个消息,是不可能一定到达的

所以对于可靠传输来说:

A -> B发送一个消息,消息是否到达B,A本身能感知到

进一步的,就可以在发送失败的时候采取一定的措施(尝试重传等)

TCP 内置了可靠传输机制

UDP 没有内置可靠传输机制

可靠传输会使机制变复杂,传输效率降低

3)TCP 是面向字节流的,UDP 是面向数据报的

此处的字节流和文件IO的字节流是一个概念

TCP 和文件操作一样,以字节为单位进行传输

UDP 是按照数据报(UDP数据报有严格的格式)为单位进行传输

网络通信数据的基本单位:

1.数据报   Datagram

2.数据包   Packet

3.数据帧   Frame

4.数据段   Segment

4)TCP 和 UDP 都是全双工的

一个信道,允许双向通信——全双工

一个信道,只能单向通信——半双工

代码中使用一个 Socket 对象,就可以发送数据也能接受数据

3.UDP 的 socket api 的使用

3.1 Socket

soketc 是操作系统的中的一个概念,本质上是一种特殊文件

把网络通信和文件操作统一了:

Socket 就属于是把“网卡”这个设备给抽象成文件了

往 Socket 文件中写数据,相当于通过网卡发送数据

往 Socket 文件中读数据,相当于是通过网卡接受数据

3.2 DatagramSocket API

DatagramSocket UDP Socket,用于发送和接收UDP数据报

在Java中使用这个类,来表示系统内部的 Socket 文件

1)DatagramSocket 构造方法:

DatagramSocket()
创建一个 UDP 数据报套接字的 Socket ,绑定到本机任意一个随机端口
(一般用于客户端)
DatagramSocket(int port)
创建一个 UDP 数据报套接字的 Socket ,绑定到本机指定的端口
(一般用于服务端)

2) DatagramSocket 方法:

void
receive(DatagramPacket p)
从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacket
p)
从此套接字发送数据报包(不会阻塞等待,直接发送)
void close()
关闭此数据报套接字

3.3 DatagramPacket AP

DatagramPacket UDP Socket 发送和接收的数据报
使用这个类,表示一个 UDP 数据报
UDP 是面向数据报的,每次进行传输,都是以 UDP 数据报为基本单位的

1)DatagramPacket 构造方法:

DatagramPacket(byte[]
buf, int length)
构造一个 DatagramPacket 以用来接收数据报,接收的数据保存在 字节数组(第一个参数 buf )中,接收指定长度(第二个参数 length
DatagramPacket(byte[]
buf, int offset, int length,
SocketAddress address)
构造一个 DatagramPacket 以用来发送数据报,发送的数据为字 数组(第一个参数 buf )中,从 0 到指定长度(第二个参数 length
address 指定目的主机的 IP 和端口号

2)DatagramPacket 方法:

InetAddress
getAddress()
从接收的数据报中,获取发送端主机 IP地址;或从发送的数据报中,获取接收端主机 IP 地址
int getPort()
从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()
获取数据报中的数据
构造 UDP 发送的数据报时,需要传入 SocketAddress,, 该对象可以使用 InetSocketAddress 来创
建。

3.4 InetSocketAddress API

InetSocketAddress SocketAddress 的子类 )构造方法:
InetSocketAddress(InetAddress addr, int port)
创建一个 Socket 地址,包含 IP 地址和端口号
http://www.lryc.cn/news/501433.html

相关文章:

  • el-dialog修改其样式不生效加deep也没用
  • 三天精通一算法之快速排序
  • 互联网、物联网的相关标准
  • Linux题库及答案
  • Android 镜像模式和扩展模式区别探讨-Android14
  • 深度学习笔记之BERT(五)TinyBERT
  • 【时间序列预测】基于PyTorch实现CNN_BiLSTM算法
  • 联想Y7000 2024版本笔记本 RTX4060安装ubuntu22.04双系统及深度学习环境配置
  • VuePress学习
  • 一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程
  • SQL最佳实践:避免使用COUNT=0
  • PG与ORACLE的差距
  • 树莓派3B+驱动开发(2)- LED驱动(传统模式)
  • 超详细搭建PhpStorm+PhpStudy开发环境
  • 分析比对vuex和store模式
  • C# 网络编程--基础核心内容
  • 【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)
  • uni-app H5端使用注意事项 【跨端开发系列】
  • SpringBoot中的@Configuration注解
  • 十二、路由、生命周期函数
  • 【蓝桥杯每日一题】X 进制减法
  • 《蓝桥杯比赛规划》
  • C++算法练习day70——53.最大子序和
  • import是如何“占领满屏“
  • ceph /etc/ceph-csi-config/config.json: no such file or directory
  • C语言——验证“哥德巴赫猜想”
  • Flourish笔记:柱状图(Column chart (grouped))
  • 深度学习案例:DenseNet + SE-Net
  • excel文件合并,每个excel名称插入excel列
  • Linux 如何设置特殊权限?