【Socket套接字编程】(实现TCP和UDP的通信)

🎇🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习!
欢迎志同道合的朋友一起加油喔 💪💪💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心

1、什么是网络编程

  • ⽹络编程 ,指⽹络上的主机 ,通过不同的进程 ,以编程的⽅式实现⽹络通信(或称为⽹络数据传输)。

在这里插入图片描述

当然 ,我们只要满⾜进程不同就⾏;所以即便是同⼀个主机 ,只要是不同进程 ,基于⽹络来传输数 据 ,也属于⽹络编程。
特殊的 ,对于开发来说 ,在条件有限的情况下 ,⼀般也都是在⼀个主机中运⾏多个进程来完成⽹络编 程。
但是 ,我们⼀定要明确 ,我们的⽬的是提供⽹络上不同主机 ,基于⽹络来传输数据资源:
进程A:编程来获取⽹络资源
进程B:编程来提供⽹络资源

2、Socket套接字

2.1、概念

Socket套接字 ,是由系统提供⽤于⽹络通信的技术 ,是基于TCP/IP协议的⽹络通信的基本操作单元。 基于Socket套接字的⽹络程序开发就是⽹络编程。
操作系统提供的网络编程的API就称为 “ socket api ”

2.2、分类

  • Socket套接字主要针对传输层协议划分为如下三类:
  1. 流套接字:使⽤传输层-----------TCP协议
    TCP ,即Transmission Control Protocol(传输控制协议),传输层协议。 以下为TCP的特点(细节后续再学习):
  • 有连接
  • 可靠传输
  • ⾯向字节流
  • 全双工
  • 有接收缓冲区 ,也有发送缓冲区
  • ⼤⼩不限
    对于字节流来说 ,可以简单的理解为 ,传输数据是基于IO流 ,流式数据的特征就是在IO流没有关闭的 情况下 ,是⽆边界的数据 ,可以多次发送 ,也可以分开多次接收。
  1. 数据报套接字:使⽤传输层UDP协议
    UDP ,即User Datagram Protocol( ⽤户数据报协议),传输层协议。 以下为UDP的特点(细节后续再学习):
  • ⽆连接
  • 不可靠传输
  • ⾯向数据报
  • 全双工
  • 有接收缓冲区 ,⽆发送缓冲区
  • ⼤⼩受限:⼀次最多传输64k
    对于数据报来说 ,可以简单的理解为 ,传输数据是⼀块⼀块的 ,发送⼀块数据假如100个字节 ,必须⼀ 次发送 ,接收也必须⼀次接收100个字节 ,⽽不能分100次 ,每次接收1个字节。
  1. Unix 域套接字 -------不能跨主机通信,只能本机上的进程和进程之间的 通信

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、UDP数据报套接字编程

3.1、API 介绍

📚DatagramSocket

  • 系统中,本身就有socket这样的概念,DatagramSocket就是对于操作系统的socket概念的封装

  • 系统中的socket,可以理解成是一种文件

  • 文件是一个广义的概念~~

  • socket文件,就可以视为是"网卡"这种硬件设备的抽象表现形式.

  • 针对socket文件的读写操作就相当于针对网卡这个硬件设备进行读写.

  • 此处,DatagramSocket就可以视为是"操作网卡"的遥控器.
    针对这个对象进行读写操作,就是在针对网卡进行读写操作.

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

  • DatagramSocket构造方法:
方法签名 方法说明
DatagramSocket() 创建⼀个UDP数据报套接字的Socket ,绑定到本机任 意⼀个随机端⼝ ( ⼀般⽤于客户端)
DatagramSocket(int port) 创建⼀个UDP数据报套接字的Socket ,绑定到本机指 定的端⼝ ( ⼀般⽤于服务端)
  • DatagramSocket 方法:
方法签名 方法说明
void receive(DatagramPacket p) 从此套接字接收数据报(如果没有接收到数据报 ,该 ⽅法会阻塞等待)
voidsend(DatagramPacket p) 从此套接字发送数据报包(不会阻塞等待 ,直接发 送)
void close() 关闭此数据报套接字

📚DatagramPacket

DatagramPacket是UDP Socket发送和接收的数据报。
Datagram Packet 构造方法:

方法签名 方法说明
DatagramPacket(byte[] buf, int length) 构造⼀个DatagramPacket以⽤来接收数据报 ,接收的 数据保存在字节数组(第⼀个参数buf) 中 ,接收指定 ⻓度(第⼆个参数length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造⼀个DatagramPacket以⽤来发送数据报 ,发送的 数据为字节数组(第⼀个参数buf) 中 ,从0到指定⻓ 度(第⼆个参数length)。address指定⽬的主机的IP 和端⼝号
  • Datagram Packet 方法:
方法签名 方法说明
InetAddress getAddress() 从接收的数据报中 ,获取发送端主机IP地址;或从发 送的数据报中 ,获取接收端主机IP地址
int getPort() 从接收的数据报中 ,获取发送端主机的端⼝号;或从 发送的数据报中 ,获取接收端主机端⼝号
byte[] getData() 获取数据报中的数据

构造UDP发送的数据报时 ,需要传⼊SocketAddress, 该对象可以使⽤InetSocketAddress来创建。

📚InetSocketAddress

InetSocketAddress(SocketAddress的⼦类 )构造⽅法:

⽅法签名 ⽅法说明
InetSocketAddress(InetAddress addr, int port) 创建⼀个Socket地址 ,包含IP地址和端⼝号

3.2、基于UDP的Socket通信

步骤分析:

  1. 服务器端先启动,创建DatagramSocket对象,监听端口,用于接收
  2. 服务器端创建DatagramPacket对象,打包用于接收的数据包
  3. 服务器阻塞等待接收
  4. 客户端启动,创建DatagramSocket对象,监听端口,用于接收
  5. 客户端创建DatagramPacket对象,打包用于发送的数据包
  6. 客户端发送数据,服务端接收
  7. 服务端接收数据后,创建DatagramPacket对象,打包用于发送的数据包,发送数据
  8. 客户端创建DatagramPacket对象,打包用于接收的数据包,阻塞等待接收
  9. 客户端接收服务端数据,断开连接,释放资源
  • java中使⽤UDP协议通信 ,主要基于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值