【Java】韩顺平Java学习笔记 第21章 网络编程

韩顺平Java学习笔记:从基础到实战 Java程序由类和对象组成,其中类是对象的蓝图。一个Java程序至少包含一个类,通常包含一个主类,其包含main方法作为程序入口点。Java文件命名通常与公共类名相同,并以.java后缀结束。示例代码:");在Java语言中,类是创建对象的蓝图,它定义了将要创建的对象的状态(属性)和行为(方法)。类的定义使用关键字class,后跟类名,以及类体(用大括号{}包围的部分)。// 类的属性// 类的构造方法// 类的方法// 对象的创建对象是类的实例,通过关键字。 阅读详情

网络相关概念

网络

  • 网络通信
  • 网络

IP地址

  • 概念
  • 表示:点分十进制
  • 分类

域名

  • 将IP地址映射成域名,方便记忆(怎么映射:HTTP协议)

端口

  • 用于标识计算机上某个特定的网络程序
  • 主机需要通过IP和端口访问到另一个主机的服务
  • 表示形式:数字 0~65535(216-1)
  • 0~1024 已被占用(网络开发中不要使用,一般被知名程序占用) ssh 22, ftp 21, smtp 25,http 80
  • 常见网络程序端口号:
    • tomcat:8080
    • mysql:3306
    • oracle:1521
    • sqlserver:1433

网络协议

  • 协议:数据的组织形式
  • TCP/IP 协议(传输控制协议)

TCP和UDP

TCP

  • 传输控制协议
  • 传输前建立连接,是可靠的
  • 进行通信的两个应用进程:客户端、服务端
  • 连接中大数据量传输
  • 效率低
  • 发送完断开连接

UDP

  • 用户数据协议
  • 不需要链接,不可靠
  • 每个数据报再64K内,不适合传输大量数据
  • 效率高
  • 发送结束无需释放资源

InetAddress 类的常用方法

  • 实现Serializable接口,可序列化
  • getLocakHost 获取本机的InetAddress对象(计算机名称、IP地址)
  • getByname 根据指定的主机名或域名获取对象
  • getHostAddress 通过对象获取对应的地址
  • getHostName 通过对象获取对应的主机名或域名

Socket(套接字)

  • 两台机器间通信的端点
  • 发起连接的一方:客户端
  • 接受(请求)连接的一方:服务端
  • 作用:当需要通讯(读写数据)时,用Socket里的getOutputStream发送数据,getInputStream接受数据
  • 两种编程方式:TCP、UDP
  • 使用完之后一定要关闭,因为连接数是有限的

TCP网络编程

  • 难点:有客户端和服务端两头,都要考虑

  • new ServerSocket(9999) 服务端在9999端口进行监听(ServerSocket可以对应多个Socket,accept到一个就返回一个Socket——多个客户端连接服务器的并发)

  • accept() :当没有客户端连接时,阻塞;当有时,返回socket对象

  • new Socket(InetAddress.getLocalHost(),9999【端口号】) 连接本机(客户端)的9999端口,连接成功返回socket对象

  • 当客户端和服务端连接时,实际上客户端也是通过一个端口连接的,这个在客户端上的端口是随机的,由 TCP/IP 分配

  • socket.getOutputStream() 得到和socket关联的输出流,输入流同理(没有得到内容的话,会阻塞) 这里用的是字节流,用字符流也可以(但是常和转换流结合)

  • 注:如果用字符流,需要手动刷新(用flush),否则不会写入(输出)。如果用带缓冲区的输出流(BufferedOutputStream),也需要手动刷新,否则不会输出

    当你使用BufferedOutputStream时,数据实际上并不是立即写入到最终的目标输出流(如文件或网络连接),而是先写入到了缓冲区中。这样设计的目的是为了减少实际的I/O操作次数,提高效率。因此,如果你不手动调用flush()方法,缓冲区中的数据会一直积攒直到缓冲区满或者你显式地调用flush()来清空缓冲区并确保数据被写入到目标输出流。

    不手动刷新直接shutdownOutput():

    如果你使用的是Socket编程中的Socket.shutdownOutput()方法,这个方法会关闭输出流,它会导致尚未写出的缓冲数据被丢弃,且后续的写操作将抛出异常。因此,直接调用shutdownOutput()而不先调用flush()来确保缓冲区的数据被写出,可能会导致数据丢失。

    直接close():

    如果你直接调用BufferedOutputStream的close()方法,实际上它内部会自动调用flush()方法来确保缓冲区中的数据被写出到目标输出流,然后再关闭流并释放相关资源。因此,直接调用close()是一种安全的做法,它既保证了数据完整性,又正确地关闭了资源。这是推荐的做法,尤其是在不需要继续使用该流的场景下。

    总结来说,虽然可以不手动调用flush()而直接调用close(),这是因为在关闭流时,close()会帮你完成刷新缓冲区的操作,确保数据安全写入。但如果是使用shutdownOutput(),则需要先手动flush(),否则缓冲区中的数据可能会丢失。

  • close() 关闭socket

  • 设置写入结束标记,防止通信通道阻塞:socket.shutdownOutput()

    或writer.newLine()(用字符流时),但要求对方用readLine()的方式读取(newLine())相当于换行符

    注意:写入结束标记写在**输出端(Output)**的后面,如果用bufferedOutputStream输出数据后shutdown,再关闭bufferedOutputStream一次会报错

    最好是shutdown之后就不再关闭这个输出流了

    GPT: socket.shutdownOutput() 方法实际上不会直接关闭 BufferedOutputStream,但它会关闭底层 Socket 输出流的写入端,从而导致任何进一步的写入操作都可能失败,并抛出 IOException。当你试图在调用 shutdownOutput() 之后关闭 BufferedOutputStream 时,BufferedOutputStream 可能会尝试刷新缓冲区中的数据,而这会因为底层输出流已经被关闭而失败。

    为了处理这种情况,可以采取以下步骤:

    1. 在调用 shutdownOutput() 之前关闭(存疑??)或刷新 BufferedOutputStream:确保所有数据已经被写入。
    2. 顺序正确:在关闭 BufferedOutputStream 之后再调用 shutdownOutput()。

    或者不使用带缓冲区的输出流,如直接使用 FileOutputStream ,则不会报错

  • 先关闭流,再关闭socket,否则会报错

注意的坑点

  • 如果要接受来自客户端的字符串,直接用socket.getInputStream得到的inputStream读取即可,在while循环中读取,用自增的方法(为了怕文件名长度超过1024字节)将读取的内容加到创建好的空字符串中,如:

    byte[] rec = new byte[1024];
            int readlen = 0;
            String s = "";
            while((readlen = socketInputStream.read(rec)) != -1){
                s += new String(rec,0,readlen);
            }
    

    不用自增的方法:

            byte[] rec = new byte[1024];
            int readlen = 0;
            readlen = socketInputStream.read(rec);
            String s = new String(rec,0,readlen);
    

netstat 指令

  • netstat -an : 查看当前主机网络情况,包括端口监听和网络连接的情况
  • netstat -an | more 可以分页显示
  • netstat -and 查看哪些程序在监听这个端口
  • 在 dos 控制台下执行
  • Listening 表示某个端口在监听
  • 如果有一个外部程序连接到端口,则显示一条连接信息

UDP网络编程

  • 通过 DatagramSocket 类和 DatagramPacket[数据报] 类来实现
  • 数据报里有客户端和服务端的完整IP和端口,故不需要建立连接
  • 没有明确的服务端和客户端,故演变成数据的发送端和接收端(地位相等)
  • 接受和发送数据通过DatagramSocket 对象完成
  • 将数据封装到 DatagramPacket[数据报] 对象(装包),接收到以后,需要进行拆包取出数据
  • DatagramSocket可以指定在哪个端口接受数据

基本流程

  • 建立发送接收端
  • 建立数据报
  • 调用DatagramSocket的发送、接收方法
  • 关闭DatagramSocket

具体操作

  • socket.receive(packet) 接收方法,有数据则接收到数据报packet,否则阻塞等待

  • socket.send(packet) 发送方法

  • 创建 DatagramSocket 对象

    DatagramSocket socket = new DatagramSocket(9999)

  • 创建 DatagramPacket 对象存放数据,第一种是准备接受数据的创建形式,第二种是准备发送数据的创建形式

    DatagramPacket packet = new DatagramPacket(buf,buf.length)(buf是字节数组)

    DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(192.168.10.1)[主机],9999[端口])

  • packet.getLength() 获取接受到的数据长度

  • packet.getData() 接受数据,返回给一个字节数组

  • socket.close() 关闭套接字

韩顺平Java编程完全手册 Java语言是一种静态类型语言,这意味着所有的变量在使用之前都必须声明其类型。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。基本数据类型包括数值类型(整型、浮点型)、字符类型(字符型)和布尔类型。这些类型的数据直接存储在栈中,它们的值直接表示数据本身,而不是指向数据的引用。整型:包括byte、short、int和long四种类型,它们分别占用8、16、32和64位的空间。浮点型:包括float和double两种类型,分别表示单精度和双精度浮点数。字符型。 阅读详情

相关推荐

韩顺平Java零基础入门视频教程

Java是一种静态类型语言,在声明变量时必须明确指定其数据类型。Java的基本数据类型决定了变量的取值范围和操作方式。变量命名的规范和作用域的掌握,直接影响代码的可读性和可维护性。而常量的使用,则是保障程序稳定性和数据一致性的关键手段。Java中使用final关键字来定义常量。常量一旦赋值就不能修改,通常用于表示固定值,如数学常数、配置参数等。// 编译错误:无法修改final变量说明:final修饰的变量必须在声明时或构造函数中初始化。- 常量通常使用。

weixin_42372837的博客 920

韩顺平JAVA学习笔记(入门自用)

目录封装(Encapsulation)继承(Extend)多态(Polymorphism)类变量和类方法(Static)代码块 (Codeblock)final 关键字抽象类 (Abstract)接口 (Interface)内部类 (InnerClass)枚举(Enumoration)异常(Exception)常用类包装类 (Wrapper)String 类StringBuffer 类Stringbuilder 类Math 类Arrays 类System 类BigInteger 和 BigDecimal 类

m0_62366961的博客 7563

模拟即时通讯软件开发:韩顺平山寨版QQ项目

本文还有配套的精品资源,点击获取 简介:“韩顺平山寨版QQ”是一个模仿QQ设计的软件,它复制了QQ的界面风格并实现了基础的通信功能,包括用户登录和服务器监听等。这个项目以教学或个人学习为目的,旨在帮助开发者理解即时通讯软件的基本构建原理。该软件可能包括登录验证、消息实时通信、错误处理、状态更新以及基本的聊天室和好友列表管理功能。 1. 韩顺平山寨版QQ概述 ...

weixin_35370061的博客 977

Java基础笔记(韩顺平)已完结

Java零基础(韩顺平老师)基础笔记,复习可以从二维数组开始看起,若笔记有误请在评论区提出,感谢!

wthsoso的博客 7215

韩顺平编写的java学习笔记(全)

韩顺平编写的java学习笔记(全) 包含各种java的基本语法,以及3大项目的详细设计解释以及代码

韩顺平_循序渐进学Java零基础【完整笔记】1

第 1 章 内容介绍11.1 本套 JAVA 课程内容11.1.1 课程的三个阶段11.1.2 关于课程的说明11.1.3 课程特色21.2 JAVA 就业方向

韩顺平 Java集合 自学笔记(Java30天基础)

Java集合 韩顺平老师 Java基础学习笔记

心向阳光的天域的博客 4280

【完美解决】Anaconda3安装后缺失大量文件,没有scripts、Library等目录

Anaconda3是官网下载的:https://www.anaconda.com/distribution/#download-section 我选择的是64位python 3.7的版本。 问题出现及现象: 我自己选择了一个D盘的目录D:\Tools\Anaconda3进行安装,装完后发现conda list命令无法执行,首先都到的是配置环境变量,然后发现安装目录下缺失大量文件(如下图)...

android之行 3万+

韩顺平Java高级课程【超全资料】——深入浅出的编程艺术

我非常兴奋地在这里分享一个宝贵的资源——韩顺平老师的Java全部课程资料。对于正在学习Java的同学们,这无疑是一个不容错过的机会。

m0_71672987的博客 1万+

Visual C++与WPF混合开发:C++/CLI桥接技术实现现代化桌面应用

在桌面应用开发领域,混合编程技术是连接不同技术栈、复用核心资产的关键手段。其核心原理在于通过特定的桥接层,实现托管代码与非托管代码之间的互操作,从而打破语言和运行时环境的壁垒。这项技术的核心价值在于,它允许开发者将高性能、高稳定性的原生C++业务逻辑库,与现代化、高表现力的WPF用户界面无缝结合,避免了重写核心代码的巨大成本和风险。在工业控制、数据可视化、上位机软件等对性能和界面均有高要求的应用场景中,这种架构尤为适用。本文以C++/CLI作为桥接技术,详细演示了如何构建一个包含原生C++核心层、C++/C

weixin_33146151的博客 278

第一章、isaacsim 及 isaaclab 安装教程

本专栏所有内容将根据上述资源地址展开,请结合食用~

m0_47719040的博客 4779

学习:韩顺平java—网络编程(第21章)

(1)套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准(2)通信的两端都要有Socket,是两台机器间通信的端点(3)网络通信其实就是Socket间的通信(4)Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输(5)一般主动发起通信的应用程序属客户端,等待通信请求的为服务端客户端发起连接,服务器端接收请求连接,形成一个数据通道,通过socke获取输入流/输出流,就可以进行数据的读取操作(1)基于客户端—服务端的网络通信。

weixin_47095832的博客 1817

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

韩顺平Java从入门到精通教学PPT:助力Java学习之路

韩顺平Java从入门到精通教学PPT:助力Java学习之路 【下载地址】韩顺平Java从入门到精通教学PPT 这套由知名Java讲师韩顺平精心制作的Java教学PPT,涵盖了从入门到精通的全面知识点,适合初学者和进阶者使用。内容详实、步骤清晰,帮助用户深入理解Java编程的基础与高级特性。无论你是刚接触Java,还是希望...

gitblog_06729的博客 1063

AI应用安全 - Prompt注入攻击

随着大模型的爆火,各行各业都在使用大模型进行智能化改造。但是如何做一个可靠的大模型应用,就需要考虑各种安全问题。本文主要介绍一种常见的安全问题,即prompt注入攻击,并介绍一些防范手段。Prompt Injection Attack(提示注入攻击)是针对大型语言模型(LLM)的一种新兴安全威胁,攻击者通过精心构造的输入提示(prompt)来操纵模型行为,使其产生非预期输出或执行恶意操作。它主要包括两种注入方式,一是直接注入,而是间接注入。

sinat_28694519的博客 1932

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

韩顺平 2021零基础学Java 学习笔记(4)(自用)

目录第 21 章 网络编程第 23 章 反射(reflection)第 24 章 零基础学 MySQL 第 21 章 网络编程 21.1 网络的相关概念 21.1.1 网络通信 21.1.2 网络 21.1.3 ip 地址 21.1.4 ipv4 地址分类 21.1.5 域名 21.1.6 网络通信协议 21.1.8 TCP 和 UDP 21.2 InetAddress 类 package com.hspedu.api; import java.net.InetAddress; imp

weixin_43973189的博客 8213

企业微信开发007_域名主体校验未通过,需配置备案主体与当前企业主体相同或有关联关系的域名_企业内部自建应用开发_配置可信域名_回调URL_可信IP---企业微信开发009

因为我这个企业微信是,已经注册了服务商了,所以我又注册了一个不是服务商的测试企业,没有实名认证的,去试了试。而且,网络上找的教程,都是不够详细的,还是会碰到各种各样的问题,记录下来,为后来者提供便利。首先我用natapp.cn 申请了一个免费的域名,然后去,一个,企业微信上去配置,注意。我这个域名,的主体,可能是域名服务商,比如阿里域名 等等的 不是一般的企业域名。我这个企业微信,是开通了服务商的,企业微信,右上角有服务商管理后台的。到时候,直接用,他们自己企业注册的域名,已经备案的再去尝试,

添柴程序猿的专栏 1694

探索Java编程之旅 —— "韩顺平_循序渐进学Java零基础"全面解析

探索Java编程之旅 —— "韩顺平_循序渐进学Java零基础"全面解析 【下载地址】韩顺平_循序渐进学Java零基础完整笔记1分享 韩顺平_循序渐进学Java零基础【完整笔记】1欢迎来到“循序渐进学Java零基础”笔记资源库 ...

gitblog_06678的博客 958

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5943

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

韩顺平java作业题_韩顺平java作业

接口体现了程序设计的多态和高内聚低耦合的思想第十四课 final 作业评讲 1.实现接口和继承父类的区别: 2.java 是单继承,一个类只允许继承一个父类,这种单继承......韩顺平java坦克大战1.0版本_源代码_工学_高等教育_教育专区。韩顺平java坦克大战1.0版本_源代码 /**画坦克 1.0 */ import java.awt.Color; import java.awt......

weixin_29711471的博客 921

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java网络编程 韩顺平 自学笔记

协议(tcp/ip) TCP/IP中文译名为传输控制协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成。 Socket 基本介绍 套接字(Socket)开发网络应用程序被广泛采用,以至于称为事实上的标准。 通信的两端都要有Socket,是两台机器间通信的端点 网络通信其实就是Socket间的通信 Socket允许程序把网络连成一个流,数据在两个Socket间通过IO传输。 一般主动发起通信的应用程序属于客户端,等待通信

心向阳光的天域的博客 1022

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java笔记-韩顺平

感觉跟向上转型有点像interface 接口名{//属性//方法(1、抽象方法。2、默认实现方法 3、静态方法)class 类名 implements 接口{自己属性;自己方法;必须实现的接口的抽象方法1、在jdk7.0接口里的所有方法都没有方法体,都是抽象方法2、jdk8.0后接口可以有静态方法,默认方法,即接口中可以有方法的具体实现//在接口中,抽象方法可以省略abstract关键字//default修饰的默认实现//static 修饰的静态方法。

Haya_7的博客 1106

Java笔记(韩顺平Java基础21-24章)

Socket 基本介绍 示意图: TCP网络通信编程 基本介绍 应用案例1(使用字节流) SocketTCP01Server.java SocketTCP01Client.java SocketTCP01Server.java SocketTCP01Client.java 应用案例2(使用字节流) SocketTCP02Server.java SocketTCP02Client.java SocketTCP02Server.java SocketTCP02Client.java 应用

jinghaize的博客 445

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.1 网络的相关概念

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.1 网络的相关概念

代码改变世界 439

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.3 Socket && 21.4 TCP网络通信编程

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.3 Socket && 21.4 TCP网络通信编程

代码改变世界 611
上一篇: 【Java】韩顺平Java学习笔记 第19章 IO流
下一篇: 【Java】韩顺平Java学习笔记 第22章 多用户通讯系统
COTAS
博客等级 码龄7年 369粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值