java网络编程学习基础篇

article/2025/10/8 22:10:44

一、基础背景

时代背景

自2000年左右,Web的快速发展以及2010左右的云原生和云计算的提出,网络通信的重要性越来越凸显出来;

  • 对于用户来说:软件的响应速度和体验是越来越重要的,而网络通信是决定响应速度关键因素之一。
  • 对于分布式系统:由于需要解决用户的大规模计算、存储需求,便采用分治的手段,进行分布式系统的构建。但分布式也具有一定的困难,例如一致性协调问题,通信的效率问题以及容错等,其中通信也是主要的考虑因素,因此现有大多数RPC框架都需要去解决该问题,使节点之间通信尽可能的快。
  • 对于Java开发者:拥有网络编程技术,将打开一扇通往世界的窗,多线程、数据结构解决的是内部(单机)的数据组织和计算、存储,而网络编程将会将视角放大到整个世界的计算、存储。

重要知识

  • 基本的网络通信模型、通信单位
  • TCP、UDP的通信过程
  • 序列化、IO的理解
  • 应用协议的理解(HTTP、WS、FTP)
  • RPC远程通信框架的理解(常见RPC :grpc,thrift)
  • 理解Docker中的网络模型
  • 考虑的基本问题:超时,请求与响应,C\S模型

相关书籍

  • 计算机网络基础(谢希仁),并采用cisco tracert进行搭建基础的网络拓扑,理解宏观的通信过程。
  • 网络是怎么连接的,较为贴切、易懂地理解网络通信
  • Unix网络编程,从OS角度去审视、分析网络编程
  • netty权威指南,构建Java高性能通信框架

二、Java的相关知识

基本IO

对于计算机通信的过程,实际上计算机将其抽象为IO,从字面上理解即输入、输出;该模型可理解为 A — B;A和B可以为机器、进程、文件等端或点,中间的线则是通信的通道,即IO流,Channel,管道,物理上的光缆等,而在其中还需要进行传输信息,信息的载体即数据也是决定其传输效率的关键。因此网络编程基本围绕以下几点讨论:

  • 端点的处理:File,Socket,进程,机器,数据库(本质也是file),考虑阻塞、非阻塞等,IO模型
  • 消息的处理:对象,字节(byte[])、xml、JSON等,序列化问题
  • 通信的协议:通信的标准协议,跨语言、跨机器等考虑

基本要点

  • 理解字节流和字符流
  • 理清IO的方向
  • IO的开销很大,注意关闭流
  • Java中的基础IO和NIO(JDK1.5后提出)

简单实践

进行文本的写入和读出;此外还可进行采用递归删除文件(或其他端节点)、创建文件等。

public class IoDemo {private final String FILE_PARENT_PATH = "E:\\JavaProjects\\LearnProjects\\java-backend\\java-base\\src\\main\\java\\com\\lyf\\network\\netty\\io";@Testpublic void testWriteToFile(){FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(FILE_PARENT_PATH+"\\test.txt");fileOutputStream.write("hello".getBytes());} catch (IOException e) {e.printStackTrace();}finally {if(fileOutputStream!=null) {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}@Testpublic void testReadFromFile(){FileInputStream fileInputStream = null;try {fileInputStream = new FileInputStream(FILE_PARENT_PATH+"\\test.txt");byte[] bytes = new byte[1024];fileInputStream.read(bytes);System.out.println(new String(bytes));} catch (IOException e) {e.printStackTrace();}finally {if(fileInputStream!=null){try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}

Socket通信-传输层

在Java中提供了传输层的通信能力;

  • TCP:端:Socket 、ServerSocket;消息:IO流,写字节流
  • UDP: 端:DatagramSocket ;消息:datagramPacket;

理解要点

  • TCP和UDP的基本通信模型,理解TCP是如何保证可靠性的(可采用wireshark进行抓包看看)。
  • 理解机器的IP和进程的确定的Port端口,进程冲突即端口冲突也是常见问题。
    在这里插入图片描述在这里插入图片描述

简单实践

设计一个简单的TCP和UDP通信(关于UDP的通信可靠保证,可参考nacos的早期推送模型com.alibaba.nacos.naming.remote.udp ),可在此基础上进行简单的聊天室设计。
在这里插入图片描述

public class TcpUdpTests {@Testpublic void testUdpServer() {try {DatagramSocket datagramSocket = new DatagramSocket(90, InetAddress.getLocalHost());// datagramSocket.bind(new InetSocketAddress(100));DatagramPacket datagramPacket = new DatagramPacket("receive".getBytes(), 4);datagramSocket.receive(datagramPacket);System.out.println("receive::" + Arrays.toString(datagramPacket.getData()));} catch (IOException e) {e.printStackTrace();}}@Testpublic void testUdpClient() {try {DatagramSocket datagramSocket = new DatagramSocket(80);//datagramSocket.connect(new InetSocketAddress(90));DatagramPacket datagramPacket = new DatagramPacket("hello".getBytes(), 0, 5, InetAddress.getLocalHost(),90);System.out.println("发送UDP报");datagramSocket.send(datagramPacket);} catch (IOException e) {e.printStackTrace();}}
}

应用层通信

  • URLConnection :相关的详细使用
@Testpublic void testApplicationProtUrl() {URL url = null;InputStream inputStream = null;try {url = new URL("http://www.baidu.com");URLConnection connection = url.openConnection();inputStream = connection.getInputStream();byte[]bytes = new byte[1024];inputStream.read(bytes);System.out.println(new String(bytes));} catch (IOException e) {e.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
  • HttpClient
      httpClient = HttpClient.newHttpClient();HttpRequest.BodyPublisher bodyPublisher = new HttpRequest.BodyPublisher() {@Overridepublic long contentLength() {return 0;}@Overridepublic void subscribe(Flow.Subscriber<? super ByteBuffer> subscriber) {}};httpRequest = HttpRequest.newBuilder().POST(bodyPublisher).header("Content-Type", "application/json").uri(URI.create("http://localhost:8080/test")).build();

更多具体可以直接看jdk-的java.net包。

常见的通信框架

  • Apache的HttpClient
  • OkHttp
    对比可参考:该文章

RCP框架

现有问题

  • Java的序列化问题:序列化的流比较大、开销时间比较大
  • Java的自带框架通信效率比较低:阻塞问题
    带来NIO的设计,提出selector\channel(解决端的问题)、buffer(解决传输介质、消息的问题)的概念。在此基础上Java领域netty进行友好地封装。

理解序列化的问题(具体见 github java-base 模块 com.lyf.network.netty.sequence包下):

class Person implements Serializable{@java.io.Serialprivate static final long serialVersionUID = -6849794470754667720L;private String username;private Integer age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}byte[] codeByNio(){ByteBuffer buffer = ByteBuffer.allocate(1024);byte[] val = username.getBytes(StandardCharsets.UTF_8);buffer.putInt(val.length);buffer.put(val);buffer.putInt(age);buffer.flip();byte[] rs = new byte[buffer.remaining()];buffer.get(rs);return rs;//buffer.array();}}public class JavaSerialTests {@Testpublic void testStreamSize() throws IOException {Person person = new Person();person.setAge(0);person.setUsername("Alan");//java序列化
//        ObjectOutputStream objectOutputStream = ObjectOutputStream.nullOutputStream();//new ObjectOutputStream();
//        objectOutputStream.writeObject(person);ByteArrayOutputStream baos  = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(baos);objectOutputStream.writeObject(person);objectOutputStream.flush();objectOutputStream.close();byte[] bytes = baos.toByteArray();System.out.println(bytes.length+":"+new String(bytes));System.out.println(person.codeByNio().length+":"+new String(person.codeByNio()));// java 附带很多Java相关的信息导致?流过大
//        202:�� sr %com.lyf.network.netty.sequence.Person��8z;�8 L aget Ljava/lang/Integer;Lusernamet Ljava/lang/String;xpsr java.lang.Integer⠤���8 I valuexr java.lang.Number������  xp    t Alan
//        12:   Alan}/*** cost by java serial:202* cost by buffer:105* @throws IOException*/@Testpublic void testSpeed() throws IOException {final int loop = 10000;Person person = new Person();person.setAge(0);person.setUsername("Alan");long c1 = System.currentTimeMillis();for(int i=0;i<loop;i++){ByteArrayOutputStream baos  = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(baos);objectOutputStream.writeObject(person);objectOutputStream.flush();objectOutputStream.close();byte[] bytes = baos.toByteArray();}System.out.println("cost by java serial:"+(System.currentTimeMillis()-c1));c1 = System.currentTimeMillis();for(int i=0;i<loop;i++){person.codeByNio();}System.out.println("cost by buffer:"+(System.currentTimeMillis()-c1));}
}
  • 采用NIO和Netty进行简单的通信:

  • 分析nacos中的Grpc的设计:


http://chatgpt.dhexx.cn/article/wCA6PBaR.shtml

相关文章

神经网络和CNN的一些基础概念,基础知识的梳理

&#xff08;好吧&#xff0c;这又是一篇软文&#xff0c;适合初学者&#xff09; 一、通用概念&#xff1a; 1. 有监督学习方法与非监督学习方法&#xff1a; 必须要有训练集与测试样本&#xff0c;模型在训练集中寻找规律&#xff0c;训练结束对测试样本使用这种规律进行…

一些神经网络基础知识归纳

神经网络&#xff08;NN&#xff09;复杂度 NN复杂度&#xff0c;多用NN层数和NN参数个数表示 如上图示 空间复杂度 层数隐藏层的层数1个输出层 上图为2层NN 总参数 3*44 4*2226 时间复杂度 乘加运算次数 3*44*220 指数衰减学习率 可以先用较大学习率&#xff0c;快速得…

Java网络编程(一)网络的基本认知

前言 这是一个信息化的时代&#xff0c;在生活中&#xff0c;网络通信无处不在。比如发送短信&#xff0c;邮件&#xff0c;视频通话等。 以邮件为例子&#xff1a; ① 收件人&#xff1a; 相当于网络编程的ip地址端口号&#xff0c;定位到某一个具体的地方&#xff01;只有找…

第四章 使用JAVA构建神经网络

• 构建一个神经网络 •激活函数 • Encog持久化 •在代码里使用Encog Analyst 这章将展示用Encog怎样构造前馈与简单递归神经网络,以及在最后部分怎样保存这些神经网络。创建神经网络类型使用BasicNetwork和BasicLayer这两个类&#xff0c;除了这两个类&#xff0c;还使用…

深入浅出讲解神经网络的种类及举例说明

本文收录于《深入浅出讲解自然语言处理》专栏&#xff0c;此专栏聚焦于自然语言处理领域的各大经典算法&#xff0c;将持续更新&#xff0c;欢迎大家订阅&#xff01;个人主页&#xff1a;有梦想的程序星空个人介绍&#xff1a;小编是人工智能领域硕士&#xff0c;全栈工程师&a…

Java网络基础知识

目录 一&#xff0c;计算机网络 1&#xff0c;概念 2&#xff0c;计算机网络的主要功能 3&#xff0c;计算机网络分类 二&#xff0c;网络通信协议及接口 1&#xff0c;网络通信协议 2&#xff0c;网络通信接口 3&#xff0c;通信协议分层思想 4&#xff0c;协议分类 …

神经网络可以用来分类吗,神经网络如何实现分类

怎么用spss神经网络来分类数据 。 用spss神经网络分类数据方法如下&#xff1a;神经网络算法能够通过大量的历史数据&#xff0c;逐步建立和完善输入变量到输出结果之间的发展路径&#xff0c;也就是神经网络&#xff0c;在这个神经网络中&#xff0c;每条神经的建立以及神经…

BP神经网络JAVA实现详解

注&#xff1a;本文手动搬家自我的新浪博客点击打开链接 从2016年3月份左右&#xff0c;我的毕业设计开题答辩时间正好是AlphaGo大战李世石之日。还记得当时答辩PPT最末引用的图片还是这张&#xff1a; 李世石大战Google的AlphaGo 不过当时答辩情况并不理想&#xff0c;答辩组老…

Java网络编程--网络基础

文章目录 网络协议常用网络协议族&#xff08;簇&#xff09;(protocol)端口&#xff08;port&#xff09;常见知名端口动态端口 IP地址IP地址分类IPv4的分类IPv6子网掩码 网络协议 是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。为了使不同计算机厂家生产的计…

神经网络如何实现分类,神经网络基本概念

人工神经网络分类方法 从20世纪80年代末期&#xff0c;人工神经网络方法开始应用于遥感图像的自动分类。 目前&#xff0c;在遥感图像的自动分类方面&#xff0c;应用和研究比较多的人工神经网络方法主要有以下几种&#xff1a;&#xff08;1&#xff09;BP&#xff08;BackP…

神经网络如何进行分类

1.首先搞清楚什么是感知机 如上图所示&#xff0c;输入为向量&#xff0c;经线性变换&#xff0c;再通过激活函数得到输出&#xff0c;这样一个完整的结构成为感知机。感知机是人工神经网络的最小单元&#xff0c;本质上由一个仿射变换接一个非线性变换组成。 上图wxb属于仿射变…

Java基础学习(17)网络编程

Java基础学习 一、 网络编程1.1 什么是网络编程1.2 常见的软件架构&#xff1a;1.3 网络编程的三要素1.4 IP1.4.1 InetAddress用法 1.5 端口号1.6 协议1.6.1 UDP协议1.6.1.1 UDP的三种通信方式 1.6.2 TCP协议1.6.2.1 TCP底层原理 一、 网络编程 1.1 什么是网络编程 解释&…

java简单的神经网络

运行环境&#xff1a;jre1.7 以下是神经网络的主体类 public class NeuralNetwork {int inputNodes;//输入层节点数int hiddenNodes;//隐藏层节点数int outputNodes;//输出层节点数double learningRate;//学习率double[][] weight_ih;//输入层与隐藏层之间的权重double[][] w…

java实现神经网络算法,java调用神经网络模型

如何用70行Java代码实现神经网络算法 。 如何用70行Java代码实现神经网络算法import.Random;publicclassBpDeep{publicdouble[][]layer;//神经网络各层节点publicdouble[][]layerErr;//神经网络各节点误差publicdouble[][][]layer_weight;//各层节点权重publicdouble[][][]la…

神经网络如何实现分类,神经网络分类特点区别

人工神经网络分类方法 从20世纪80年代末期&#xff0c;人工神经网络方法开始应用于遥感图像的自动分类。 目前&#xff0c;在遥感图像的自动分类方面&#xff0c;应用和研究比较多的人工神经网络方法主要有以下几种&#xff1a;&#xff08;1&#xff09;BP&#xff08;Back …

Java神经网络(一)——Neuroph初次使用

Java神经网络 前言Neuroph框架Neuroph结构框架图Java API 及其类库说明&#xff08;core nnet util&#xff09; Neuroph简单案例实现下载必要的Neuroph jar包导入jar包找案例&#xff08;在书中或者网上&#xff09;运行解决方案 前言 学了好一阵子时间的神经网络&#xff0c;…

神经网络分类

人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;简称神经网络(NN)&#xff0c;是基于生物学中神经网络的基本原理&#xff0c;在理解和抽象了人脑结构和外界刺激响应机制后&#xff0c;以网络拓扑知识为理论基础&#xff0c;模拟人脑的神经系统…

神经网络分类总结

1.人工智能、机器学习与深度学习 人工智能&#xff1a;努力将通常由人类完成的智力任务自动化。机器学习机器学习&#xff08; machine learning&#xff09;是人工智能的一个特殊子领域&#xff0c;其目标是仅靠观察训练数据来自动开发程序&#xff3b;即模型&#xff08; mo…

神经网络分类四种模型,神经网络分类特点区别

神经网络有哪些主要分类规则并如何分类&#xff1f; 神经网络模型的分类人工神经网络的模型很多&#xff0c;可以按照不同的方法进行分类。其中&#xff0c;常见的两种分类方法是&#xff0c;按照网络连接的拓朴结构分类和按照网络内部的信息流向分类。 1按照网络拓朴结构分类…

【学习记录】神经网络三种主要类型

1.图结构 图网络是定义在图结构数据上的神经网络&#xff1a;①图中每个节点都由一个或一组神经元组成②节点之间连接可以有向可以无向③每个节点可接收来自相邻节点或自身的信息。 2.前馈神经网络 前馈神经网络中&#xff0c;把每个神经元接受信息的先后分为不同的组&#xf…