基于UDP/TCP的网络通信编程实现

小王学习录

  • 今日鸡汤
  • Socket套接字
    • 基于UDP来实现一个网络通信程序
      • DatagramSocket类
      • DatagramPacket类
      • 基于UDP的服务器端代码
      • 基于UDP的客户端代码
    • 基于TCP来实现一个网络通信程序
      • ServerSocket类
      • Socket类
      • 基于TCP的服务器端代码
      • 基于TCP的客户端代码
      • 优化之后的服务器端代码
  • 补充
    • TCP长短连接
    • IO多路复用(多路转接)

今日鸡汤

红色是心中永不褪色的赤诚
在这里插入图片描述

Socket套接字

操作系统为网络编程提供了Socket api, Socket是基于TCP/IP协议的网络通信的基本单元, 基于Socket的网络程序开发就是网络编程.

  • 由于直接与应用层联系的是传输层, 所以针对应用层协议(TCP, UDP), Shocket提供了三种套接字, 分别是流套接字(使用TCP), 数据报套接字(使用UDP), 原始套接字
    先简单介绍一下TCP和UDP吧
  1. TCP传输有连接, 可靠传输, 面向字节流, 全双工
    (1)有连接: 在数据转发之前会先建立连接, 这里涉及到挥手, 之后会具体介绍
    (2)可靠传输: 可靠传输不代表一定会传输过去, 而是说发送方会知道是否发送成功, 如果失败, 则会重新发送
    (3)面向字节流: 以字节为单位
    (4) 全双工: 在发送的同时也可以作为接收方来接收数据
  2. UDP传输无连接, 不可靠, 面向报文段, 全双工
    (1) 无连接: 在数据转发之前发送方和接收方不会建立连接
    (2) 不可靠: 发送方在发送之后不会管是否被接受
    (3) 面向报文段: 发送数据以报文段为单位
    (4) 全双工: 在发送数据的同时可以作为接收方接受数据

基于UDP来实现一个网络通信程序

在这里要接触到两个类: DatagramSocket, 和DatagramPacket.

端口号用于指定区分进程, 因此一个端口只能同时被一个进程使用(实际上端口是被Socket对象使用), 一个进程可以同时使用多个进程(这里对端口号不熟悉有疑惑的同志可以先查阅了解一下端口号的作用)

当进程fock一个子进程时, 可以实现一个端口被多个进程使用, 但是java并没有提供fock的api

DatagramSocket类

通过DatagramSocket类创建的对象就是一个Socket, 操作系统将这个socket对象看成是一个文件, 之前普通文件对应的硬件为硬盘, 这里的socket对应的硬件是网卡, 有了socket之后就可以通过socket来操作网卡, 从而实现与其他主机的通信了.
下面看一下DatagramSocket类中的方法

  • 构造方法
    在这里插入图片描述构造方法无参时, 会为当前的通信线程随机安排一个空闲端口, 指定port参数时会为当前线程中的socket显式绑定一个端口. 通常为服务器显式指定一个端口, (因为服务器上的端口使用情况程序员是清楚的, 指定端口之后方便客户端进行访问) 客户端随机分配空闲端口(因为不确定当前哪些端口空闲)

  • 发送和接收
    在这里插入图片描述这两个方法用于客户端表示向服务器发起请求, 接受来自服务器端的响应
    这两个方法用于服务器表示接受客户端的请求, 向客户端发起响应

  • 关闭(释放资源)在这里插入图片描述

DatagramPacket类

通过DatagramPacket类创建的对象是一个数据报. UDP是面向报文段, 创建了DatagramPacket对象之后便可以使用数据报来进行通信, 下面看看这个类的方法

  • 构造方法在这里插入图片描述由构造方法可以知道, 在创建数据报时可以使用缓冲区数组, 并需要指定目的ip地址和目的端口号.注意这里的缓冲数组是一个空数组, 在接收到来自客户端的报文段时会填充, 属于输出型参数

还有一些获取当前报文段内容, 获取当前报文段中的源ip, 获取当前报文段中的源端口等就不一 一列了

基于UDP的服务器端代码

服务器要完成三个任务:

  • 接受来自客户端的报文段(请求)
  • 根据请求来计算响应(复杂业务逻辑)
  • 将响应发送到客户端
public class echoServer1 {private DatagramSocket socket = null;//创建pocket对象, 这里是服务器端, 需指定端口号public echoServer1(int port) throws SocketException {socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动: ");while (true){//创建数据报, 用于接受来自客户端的数据报DatagramPacket requestPacket = new DatagramPacket(new byte[1024], 1024);//这里的receive会陷入阻塞, 直到有数据报发过来socket.receive(requestPacket);//将数据报中的内容转换为字符串, 方便计算响应//上面的缓冲数组不一定会填满, 这里只获取实际长度即可(getLength)String request = new String(requestPacket.getData(), 0, requestPacket.getLength());//调用计算方法, 计算响应String response = handle(request);//注意此处用response.getBytes().length, 而不用responsePacket.length(), 因为responsePacket中可能含有汉字, 汉字转换为byte类型之后字节个数与字符个数不一样DatagramPacket responsePacket =new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());//将响应发送给客户端socket.send(responsePacket);//打印日志System.out.printf("[%s, %d], req: %s, resp: %s \n", requestPacket.getAddress().toString(), requestPacket.getPort(),request, response);}}public String handle(String request){//这里的响应只是简单的回显, 没有复杂的代码逻辑return request;}public static void main(String[] args) throws IOException {//创建服务器对象, 指定端口为1025, 此端口号与客户端发送请求时指定的端口号需一致echoServer1 server1 = new echoServer1(1025);//调用start方法, 启动服务器server1.start();}
}

基于UDP的客户端代码

客户端要完成四个任务:

  • 从控制台接收数据
  • 根据数据向服务器发送请求
  • 接受服务器的响应
  • 将服务器响应打印出来
public class echoClient {
//创建一个socket, 用于和客户端通信private

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/174048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置

文章目录 一、初识 MyBatis Plus1.1 MyBatis Plus 是什么1.2 MyBatis Plus 和 MyBatis 的区别 二、在 Spring Boot 项目中集成 MyBatis Plus2.1 环境准备2.2 引入 MyBatis Plus 依赖2.3 定义 Mapper2.4 测试 MyBatis Plus 的使用 三、MyBatis Plus 常用注解3.1 为什么需要注解3…

rust 创建多线程web server

创建一个 http server,处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议,http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象,监听地址为127.0.0.1:8080. us…

css文字竖向排列

div { writing-mode: vertical-rl;text-orientation: upright;font-size: .25rem; //文字大小letter-spacing: 0.1em; //文字间距}

常用第三方库

Moment GTC(Greenwish Mean Time):格林威治时间,太阳时,精确到毫秒UTC(Universal Time Coodinated):世界协调时间,原子种计时,精确到纳秒 GTC和UTC都是以0时区作为标准时间戳:以UTC的1970-1-1 …

python自动化测试(五):按键模拟输入:全选、复制、清空、粘贴、完成

前置条件: 本地部署:ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) (32 位) Google驱动的selenium版本是3.11.0 目录 一、配置代码 二、键盘组合输入 2.1 全选:ctrl a 2.2 复制…

OpenCV官方教程中文版 —— Hough 直线变换

OpenCV官方教程中文版 —— Hough 直线变换 前言一、原理二、OpenCV 中的霍夫变换三、Probabilistic Hough Transform 前言 目标 • 理解霍夫变换的概念 • 学习如何在一张图片中检测直线 • 学习函数:cv2.HoughLines(),cv2.HoughLinesP() 一、原理…

DIY相机(一)libcamera库

相机选型 DIY相机首先是要确定使用的相机型号。兼容树莓派,画质好一些的,目前主要有两款:一是Raspberry Pi Camera Module 3,二是Raspberry Pi HQ Camera。 下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等…

JDK21下载和安装

说明 本文介绍 JDK21(Oracle版)的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型,下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包,开始安装。 把路径改为自定…

openpnp - SlotSchultzFeeder source code bugfix

文章目录 openpnp - SlotSchultzFeeder source code bugfix概述笔记openpnp源码调试环境排查思路开git分支查到的问题 - 1查到的问题 - 2查到的问题 - 3针对以上问题进行的逻辑修正D:\my_openpnp\openpnp_github\src\main\java\org\openpnp\machine\reference\driver\wizards\G…

【计算机视觉】对极几何

文章目录 一、极线约束(Epipolar Constraint)二、相机标定过的情况三、相机没有标定过的情况四、八点算法(eight-point algorithm) 我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 在上一…

Nokogiri库和OpenURI库使用HTTP做一个爬虫

Nokogiri和OpenURI是两个常用的Ruby库,用于编写爬虫程序。它们的主要功能如下: 1、Nokogiri:Nokogiri是一个强大的HTML和XML解析库,可以用于解析网页内容。它提供了一组简单易用的API,可以方便地遍历和操作HTML或XML文…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂(静态) 假如我想换个手机,换什么手机呢?可以考虑苹果或者华为手机,那我们用简单工厂模式来实现这个功能: 我们关注的产品是手…

selenium判断元素可点击、可见、可选

1、判断元素是否可以点击 判断元素是否可以点击,WebElement对象调用is_enabled() is_enabled()方法返回一个布尔值,若可点击返回:True。若不可点击则返回:False from selenium import webdriver import time from selenium.web…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

ARP和DDOS攻击防御介绍

✍ 如何利用ARP漏洞进行攻击? ✍ 怎样有效地防御ARP攻击? ✍ 如何应对DDOS攻击? ---- ARP -- 地址解析协议 ---- 最简单的协议 pc和交换机通信后就会更新地址表: ARP: PC1要访问百度: 发送一个广播…

基于SSM的个性化美食推荐系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Websocket传递JWT令牌

在访问带有[Authorize]的方法的时候,需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证,否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时,…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前,以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量,被视作推动经济社会发展的关键增长极。 AI大模型潮起,千行百业走向百舸争流的AI创新应用期,前沿信息技术向手机、PC、车机等消费级终端加速渗…

Beyond Compare比较规则设置 Beyond Compare怎么对比表格

在对文件进行比较时,文件夹内的文件可能存在不同类型、不同后缀名、不同内容等差异,这些差异会影响具体的比较结果,因此需要我们对软件的比较规则进行一些设置。接下来就让我们一起来学习一下Beyond Compare比较规则设置,Beyond C…

Qt+JSON简单例子

QtJSON简单例子 QtJSONexample2参考 QtJSON #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtDebug> #include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QTextCodec> #i…