【从C++到Java一周速成】章节14:网络编程

章节14:网络编程

  • 【1】网络编程的概念
  • 【2】IP地址与端口的概念
  • 【3】网络通信协议
    • 引入
    • 网络通信协议的分层
  • 【3】Socket套接字
  • 【4】单向通信
  • 【5】双向通信

【1】网络编程的概念

把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。设备之间在网络中进行数据的传输,发送/接收数据。

【2】IP地址与端口的概念

  • IP地址:用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。
  • 端口号:IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用端口来区分这些应用程序。

【3】网络通信协议

引入

计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等指定标准。

由于结点间联系复杂,制定协议时,把复杂成分分解成一些简单的成分,再讲它们复合起来。最长用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。

网络通信协议的分层

  • 名义上的标准:ISO/OSI参考模型(但实际上只停留在实验室,停留在理论讲解,实际上没有得到应用,并没有实际的产品出来)
ISO/OSI参考模型一共7层
应用层程序实现需求
表示层解决不同系统之间的通信问题:比如Linux给Windows发包
会话层自动发包,自动寻址功能
传输层当传输的内容过大时,对发出去的数据进行封装
网络层传输过程中选择最优路径(就是路由器,交换机那些具有寻址功能的设备所实现的功能)
数据链路层确保数据传输正确,提供检测和纠错功能
物理层定义物理设备的标准:网线的接口类型,光纤的接口类型,各种传输介质的传输速率;数据最终变成01串从物理设备中传输出去
  • 事实上的标准:TCP/IP协议栈(Internet使用的协议)
TCP/IP协议一共4/5层
应用层负责应用程序间的数据通讯。最常见的协议为DNS和HTTP
传输层负责两台主机间的数据传输。常见协议为TCP和UDP
网络层自动发包,自动寻址功能
数据链路层负责设备之间的数据帧的传送和识别
物理层(可选)负责将数据转换成信号,再将信号转换为数据

【3】Socket套接字

程序员开发的网络应用程序位于应用层,如果要使用网络,只需要与传输层交接即可,可以把传输层理解为快递员,程序员寄快递只需要把快递给快递员,至于快递怎么运输的不用管。

在应用层如何使用传输层的服务呢?Socket套接字就是应用层与传输层之间的桥梁,应用程序通过这个桥梁向远程发送或接收远程数据。
在这里插入图片描述

【4】单向通信

先创建一个服务器端

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端启动");
        //套接字,IP默认为本地网络IP,端口号随便设置一个,但要保证服务器端与客户端一致
        ServerSocket ss = new ServerSocket(1234);//此处的异常抛出即可
        //等待客户端发送数据
        Socket s=ss.accept();
        //本例中服务器要接受数据则创建输入流
        InputStream is=s.getInputStream();
        DataInputStream dis=new DataInputStream(is);
        //接受客户端发送的数据
        String str=dis.readUTF();
        System.out.println(str);
        //倒序依次关闭流与网络资源
        dis.close();
        is.close();
        s.close();
        ss.close();
    }
}

运行,让服务器端启动,服务器会一直等待客户端发送的数据
在这里插入图片描述
再创建一个客户端

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class TestClient {
    public static void main(String[] args) throws IOException {
        System.out.println("客户端启动");
        //套接字:指定服务器的ip和端口号
        Socket s=new Socket("10.67.3.131",1234);
        //本例通过客户端发送数据,创建输出流
        OutputStream os=s.getOutputStream();
        DataOutputStream dos=new DataOutputStream(os);
        //发送数据
        dos.writeUTF("你好");
        //关闭流、网络资源
        dos.close();
        os.close();
        s.close();
    }
}

运行客户端,可以看到客户端发送完数据后关闭了
在这里插入图片描述
这时发现服务器端接收到了数据
在这里插入图片描述

【5】双向通信

服务器端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端启动");
        //套接字,IP默认为本地网络IP,端口号随便设置一个,但要保证服务器端与客户端一致
        ServerSocket ss = new ServerSocket(1234);//此处的异常抛出即可
        //等待客户端发送数据
        Socket s=ss.accept();
        //本例中服务器要接受数据则创建输入流
        InputStream is=s.getInputStream();
        DataInputStream dis=new DataInputStream(is);
        //接受客户端发送的数据
        String str=dis.readUTF();
        System.out.println(str);

        //向客户端发送数据
        OutputStream os=s.getOutputStream();
        DataOutputStream dos=new DataOutputStream(os);
        dos.writeUTF("你好客户端,我是服务器,我收到了你的消息");

        //倒序依次关闭流与网络资源
        dos.close();
        os.close();
        dis.close();
        is.close();
        s.close();
        ss.close();
    }
}

客户端

import java.io.*;
import java.net.Socket;

public class TestClient {
    public static void main(String[] args) throws IOException {
        System.out.println("客户端启动");
        //套接字:指定服务器的ip和端口号
        Socket s=new Socket("10.67.3.131",1234);
        //本例通过客户端发送数据,创建输出流
        OutputStream os=s.getOutputStream();
        DataOutputStream dos=new DataOutputStream(os);
        //发送数据
        dos.writeUTF("客户端:你好");

        //接收服务器端发来的数据
        InputStream is=s.getInputStream();
        DataInputStream dis=new DataInputStream(is);
        String str=dis.readUTF();
        System.out.println("服务器端:"+str);

        //关闭流、网络资源
        dis.close();
        is.close();
        dos.close();
        os.close();
        s.close();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud Alibaba详解:打造高可用的分布式系统

SpringCloud Alibaba是一个基于Spring Cloud的微服务开发框架,它集成了阿里巴巴的一系列中间件和工具,能够快速构建高可用的分布式系统。在本文中,将详细介绍如何使用SpringCloud Alibaba来打造高可用的分布式系统,并通过代码案例…

jenkins插件之Warnings

Warnings插件,收集静态分析工具报告的编译器警告或问题,并将结果可视化。它内置了对许多编译器的支持(cpp,clang,java等)和工具(spotbugs,pmd,checkstyle,esl…

本是梦中人,常作花下客。心中自往来,知我有几个。

我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然, 其实是竭尽所能之后的不强求, 而非两手一摊的不作为。 一花凋零荒芜不了整个春天, 一次挫折也荒废不了整个人生。 多年后&#x…

HQL面试题练习 —— 品牌营销活动天数

题目来源:小红书 目录 1 题目2 建表语句3 题解 1 题目 有营销活动记录表,记录了每个品牌每次营销活动的开始日期和营销活动的结束日期,现需要统计出每个品牌的总营销天数。 注意: 1:苹果第一行数据的营销结束日期比第二行数据的营…

Mask R-CNN实战

一、源码和数据集的准备 获取git开源项目代码 https://github.com/matterport/Mask_RCNN 一下载2.1的前三个文件,和2.0的第一个h5文件,coco.h5是预训练权重,也放入源码 项目文件结构如下: samples/logs:训练模型保存的位置 配置…

GeoScene产品学习视频收集

1、易智瑞运营的极思课堂https://www.geosceneonline.cn/learn/library 2、历年易智瑞技术公开课视频资料 链接:技术公开课-易智瑞信息技术有限公司,GIS/地理信息系统,空间分析-制图-位置智能-地图 3、一些关于GeoScene系列产品和技术操作的视…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题:使用Jackson将一个超级大的JSON字符串转换POJO失败,debug看没问题,将JSON字符串粘贴到main方法中测试,提示错误信息如下: 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

20232802 黄千里 2023-2024-2 《网络攻防实践》实践十一报告

20232802 2023-2024-2 《网络攻防实践》实践十一报告 1.实践过程 1.1web浏览器渗透攻击 攻击机:kali172.20.10.10靶机:win2k172.20.10.3 首先在kali中启动msfconsole 输入命令search MS06-014,搜索渗透攻击模块 输入use exploit/window…

基于jeecgboot-vue3的Flowable增加流程支持组件与element-plus组件导入支持

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、package.json文件需要增加相关流程组件,如下 "dependencies": {"element-plus/icons-vue": "^2.3.1","highlightjs/vue-plugin":…

设备管理全解析:从选购到报废的全方位指南

在现代企业快速发展、智能化运营过程中,企业设备管理是保障生产连续性和效率的核心环节,其重要性不言而喻。然而,许多企业在设备管理内容流程方面仍然使用传统管理办法,这不仅影响了生产效率,也增加了不必要的成本。那…

二叉树创建与销毁操作详解

目录 一、通过前序遍历的数组构建二叉树 1.1 递归思路 1.2 递归分支图 1.3 递归栈帧图 1.4 C语言实现 二、二叉树的销毁 2.1 递归思路 2.2 递归分支图 2.3 递归栈帧图 2.4 C语言实现 一、通过前序遍历的数组构建二叉树 牛客网链接:二叉树遍历_牛客题霸_牛…

Spring ----> IOC

文章目录 一、 Spring 是一个包含众多工具的IoC容器二、 什么是IOC以及好处三、 如何实现loc思想四、Spring提供的实现loC的方法 --- 类注解方法注解4.1 类注解类注解概念介绍类注解的使用 4.2 方法注解Bean 一、 Spring 是一个包含众多工具的IoC容器 场景解析:首先…

分布式事务解决方案(强一致性)

强一致性事务概述 分布式事务领域,最早采用的是符合CAP理论的强一致性事务方案来解决分布式事务问题,强一致性分布式事务要求在任意时刻查询参与全局事务的各个节点的数据都是一致的 典型案例: 包括DTP模型(全局事务模型&#x…

微软Power Automate平台将引入AI工作流

最近的微软 Build 大会展示了许多新的计划和增强功能,特别是围绕将 AI 集成到微软的产品和平台中。一个重点是扩展 Microsoft Copilot 在各种应用和服务中的功能。此外,微软还宣布对 Azure AI 进行了重大更新,旨在使云计算更加有用。虽然在 B…

aws eks理解和使用podidentity为pod授权

参考链接 https://www.amazonaws.cn/new/2024/amazon-eks-introduces-eks-pod-identity/https://aws.amazon.com/cn/blogs/aws/amazon-eks-pod-identity-simplifies-iam-permissions-for-applications-on-amazon-eks-clusters/ 先决条件 集群版本需要符合要求,如果…

SBC3568启动升级,灵活更换动画logo

今天小智将会带着大家体验如何在openharmony sdk内替换开机logo和动态动画。 1. 更换开机logo 开机logo分为uboot阶段【logo.bmp】和kernel阶段【logo_kernel.bmp】的logo两个文件,对图片的要求是:必须为bmp格式,8或者24位深,且…

3、md5比较绕过

青少年ctf:EasyMD5 1、页面是一个上传页面 2、上传两个txt文件,bp抓包 3、go发现提示要PDF文件 4、将文件类型改成PDF类 5、改文件类型提示MD5,也看出它是将文件里的内容读取比较 6、改成s878926199a和QNKCDZO 猜测后端源码: if…

Servlet的response对象

目录 HTTP响应报文协议 reponse继承体系 reponse的方法 响应行 public void setStatus(int sc) 响应头 public void setHeader(String name, String value) 响应体 public java.io.PrintWriter getWriter() public ServletOutputStream getOutputStream() 请求重定…

【东山派Vision K510开发板试用笔记】nncase的安装

概述 最近试用了百问网提供的东山派Vision开发板,DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板,主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发等用途。DongshanPI-Vision开发板采用嘉楠公司…

【区块链】fisco节点运维 更新ing

基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下 以下只是举例子讲 如果有其他修改没举例出来可以留言 私信 主要以比赛出题的形式讲 区块链节点输出等级为警告级,并设置日志存储阈值为100MB并…