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

news2024/11/24 17:24:13

章节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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录Python低代码开发框架zdppy_amcrud的开发过程

实现新增接口 基础代码 import env import mcrud import api import snowflakeenv.load(".env") db mcrud.new_env()table "user" columns ["name", "age"]async def add_user(req):data await api.req.get_json(req)values [d…

贪心算法--区间调度问题

贪心算法 引言 贪心算法是一种简单而有效的算法设计技巧,在解决一些优化问题时具有广泛的应用。其基本思想是通过每一步的局部最优选择,最终达到全局最优解。贪心算法通常不会回溯之前的决策,而是根据当前状态作出最优决策,因此…

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

Leetcode刷题2

文章目录 前言寻找两个正序数组的中位数1️⃣ 双指针快速排序2️⃣ 第k小数解法 Z 字形变换1️⃣ 个人解法2️⃣巧妙解法13️⃣巧妙解法2 字符串转换整数 (atoi)1️⃣ 常规方法2️⃣ 作弊方法😫 整数转罗马数字1️⃣ 常规方法:按照给定规则写出判断条件即…

Python使用thread模块实现多线程

介绍: 线程(Threads)是操作系统提供的一种轻量级的执行单元,可以在一个进程内并发执行多个任务。每个线程都有自己的执行上下文,包括栈、寄存器和程序计数器。 在Python中,可以使用threading模块创建和管理…

Mybatis源码剖析---第一讲

Mybatis源码剖析 基础环境搭建 JDK8 Maven3.6.3&#xff08;别的版本也可以…&#xff09; MySQL 8.0.28 --> MySQL 8 Mybatis 3.4.6 准备jar&#xff0c;准备数据库数据 把依赖导入pom.xml中 <properties><project.build.sourceEncoding>UTF-8</p…

面试问题小结

说说你的项目&#xff0c;从里面学到啥了&#xff08;随便说&#xff09; CAS 线程池 的各个方面 线程咋创建&#xff08;4种方式&#xff09; 说一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B树中咋存储的&#xff08;类似下面的图&#xff0c;变通一下就行了&a…

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…

k8s集群部署成功后某个节点突然出现notready状态解决办法

通过&#xff1a; kubectl get nodes 查看master1节点为not ready 通过查看日志&#xff1a; journalctl -f -u kubelet.service 看到这里 查看状态&#xff1a; systemctl status kubelet.service 重启一样会报错 执行&#xff1a; swapoff -a 执行后&#xff0c;重启…

行业首发 | MS08067-SecGPT(送邀请码)

一、简介 MS08067-SecGPT基于LLM大模型技术专门为网络安全领域设计的智能助手&#xff0c;集问答、分析、工具为一体的对话式安全专家&#xff0c;支持可以创建多会话问答。目的是辅助用户完成网络安全相关的工作&#xff0c;学员通过问答方式体验到SecGPT所具备的威胁情报分…

查看目录或文件的磁盘使用情况

在排查问题过程中&#xff0c;会遇到磁盘占满&#xff0c;需要排查具体哪个文件占用比较大&#xff0c;此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括&#xff1a; -h 或 --human-readable&#xff1a;以人类可读的格式&#xff08;如 K、M、G&#xff09;…

机器学习第四十周周报 WDN GGNN

文章目录 week40 WDN GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 问题提出3.2 GNN3.3 CSI GGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据获取4.3.2 参数设置4.3.3 实验结果 5. 结论二、GGNN1. 代码解释2. 网络结构小结参考文献参考文…

汉明码(海明码)的计算的规则

一.汉明码的由来 1.汉明码&#xff08;Hamming Code&#xff09;&#xff0c;是在电信领域的一种线性调试码&#xff0c;以发明者理查德卫斯里汉明的名字命名。汉明码在传输的消息流中插入验证码&#xff0c;当计算机存储或移动数据时&#xff0c;可能会产生数据位错误&#x…

mdm 推送证书制作教程

第一步点击获取&#xff0c;点击以后会下载一个zip压缩包 解压以后&#xff1a;会得到四个文件&#xff0c;请务必保存好&#xff0c;待会需要使用 登录apple开发者官网 https://developer.apple.com/account/resources/certificates/list 点击添加证书 找到mdm csr 然后点击…

Python | Leetcode Python题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsequeue1 collections.deque([p])queue2 collections.deque([q])while queue1 and queue2:node…

在Windows上创建RAM Disk

在Windows 10上创建一个与Linux中的tmpfs相似的内存文件系统&#xff08;一个文件系统&#xff0c;它使用主内存作为存储&#xff09;通常不是操作系统直接提供的功能。不过&#xff0c;有一些方法可以实现类似的效果。 使用软件创建RAM Disk 有一些第三方软件可以帮助在Wind…

crmeb Pro版/多店版商城付费会员、会员卡功能说明

一、功能介绍 用户开通付费会员后&#xff0c;可获得多项商城优惠&#xff0c;商家可通过此功能锁定重要客户&#xff0c;培养客户消费习惯等 二、操作流程 用户 &#xff1e; 会员管理 &#xff1e; 付费会员 三、功能说明 会员类型 付费卡类型&#xff1a;月卡、季卡、年卡…

集合框框框地架

这一次来介绍一下常用的集合&#xff1a; 首先是两种集合的《家庭系谱图》&#xff1a; 接下来介绍一下集合的种类&#xff1a; Collection Set SetTreeSet&#xff1a;基于红⿊树实现&#xff0c;⽀持有序性操作&#xff0c;例如&#xff1a;根据⼀个范围查找元素的操作。但…

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃&#xff0c;其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性&#xff0c;使其能够无缝处理和生成文本、音频…

基于灰狼优化算法优化支持向量机(GWO-SVM)时序预测

代码原理及流程 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的时序预测代码的原理和流程如下&#xff1a; 1. **数据准备**&#xff1a;准备时序预测的数据集&#xff0c;将数据集按照时间顺序划分为训练集和测试集。 2. **初始化灰狼群体和SVM模型参数…