Java基础第十八天 - 网络编程

计算机网络

什么是计算机网络

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

计算机网络主要功能

1.实现资源共享

2.信息传输和集中处理

3.均衡负荷以及分布处理

4.综合信息服务 (www/综合业务数字网络 ISDN)

网络通信三要素

1. ip           2.端口号          3.协议

IP地址

   域名  =  ip+端口号

    默认端口号: 80

命令:

     ping ip地址或者域名   /查看是否与指定ip连通

      ipconfig:查看本机信息,包括自己的ip

ip地址分为: ipv4,ipv6  

IPv4: 是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d 的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。

IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。

为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。

IP地址:

网络计算机的唯一标识

计算机底层只能识别二进制数据,所以我们的ip地址应该是一个二进制数据

IP地址的组成 :

网络号段 + 主机号段

IP地址分类: IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。 全0和全1的都保留不用。

A类:(1.0.0.0-126.0.0.0)  (默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
       
B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节 为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。 
      
       
C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个 字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。 
       
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
       
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。 

私有地址(不再互联网上使用,而是局域中使用):

10.x.x.x

192.168.x.x

172.16.0.0 - 172.31.255.255

端口号

网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?

如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。

  • 端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

利用协议+IP地址+端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。

网络默认端口:80

协议

OSI七层模型

传输层协议

UDP

UDP (User Datagram Protocol) : 用户数据报协议,用于传输层,作用: 发送IP 数据包

特点:

无连接,不安全(不可靠), 传输速度快

TCP( 三次握手,四次挥手)

TCP(Transmission Control Protocol): 传输控制协议,用于传输层 , 和IP协议共同使用

特点:

面向连接, 可靠(安全性),字节流,传输较慢

Socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

类型:

流式套接字、数据报套接字和原始套接字

Socket 原理

  1. 通信的两端都有Socket

  2. 网络之间的通信就是Socket间的通信

  3. 数据在两Socket间通过IO传输

UDP协议实现对话

客户端:

package UDP_Thread;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UDP_client {
    public static void main(String[] args) {
//        1.创建一个发送端的套接字
          DatagramSocket dsg = null;
        try {
           dsg  = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Scanner scanner = new Scanner(System.in);
while (true){
    System.out.println("你要发送的信息:");
    String str = scanner.next();

//        2.创建接收信息的数组
    byte[] bytes = new byte[1024];
            bytes = str.getBytes();
//        3.设定要上传的服务器地址
    InetAddress address=null;
    try {
        address  = InetAddress.getByName("localhost");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

//        4.将数据打包上传
    DatagramPacket datapa = new DatagramPacket(bytes,0,bytes.length,address,8888);

    try {
        dsg.send(datapa);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


    }
}

服务器端:

package UDP_Thread;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UDP_service {
    public static void main(String[] args) throws IOException {


//        1.创建一个接收段的套接字
        DatagramSocket datasoc =null;//try{}的作用域问题
        try {
             datasoc = new DatagramSocket(8888);
        } catch (SocketException e) {
            e.printStackTrace();
        }
while (true){
    //        2.创建一个接收数据的数组
    byte[] bytes = new byte[1024];
//        3.创建数据包获得客户传来的数据
    DatagramPacket ds = new DatagramPacket(bytes, bytes.length);
//        4.调用方法接收

    try {
        datasoc.receive(ds);
    } catch (IOException e) {
        e.printStackTrace();
    }

//        5.获取对方的IP,主机名
    InetAddress address = ds.getAddress();
//    System.out.println("IP:"+address.getHostAddress());
//    System.out.println("主机:"+address.getHostName());

//        6.在服务器输出传入的数据
    byte[] data= new byte[1024];
     data = ds.getData();
    System.out.println(address+" 说: "+new String(data,0, ds.getLength()));



}


    }
}

TCP协议实现对话

客户端:

package homework;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);

//        1. 创建Socket( 指定ip ,端口)
        Socket socket = new Socket("localhost",8089);
        String str;
        while (true){
            System.out.println("请输入要发送的内容:");
            str = scanner.next();
            if (str.equals("886")){
                socket.close();
                break;
            }
//            (可以向服务写数据)
//        2. 创建输出流对象
            OutputStream outputStream = socket.getOutputStream();

//        3. 写入输出的数据
            outputStream.write(str.getBytes());

//      ( 读取服务端数据 )
//       4. 创建输入流对象
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];

//       5. 读取服务器的数据, 打印出来
            int len=inputStream.read(bytes);
            System.out.println(new String(bytes,0,len));


        }
//

//        6. 释放资源

    }
}

服务端:

package homework;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TcpService {
    public static void main(String[] args) throws IOException {
//        1. 创建ServerSocket( 指定端口)
        ServerSocket serverSocket = new ServerSocket(8089);



            //        2. 监听客户端的请求,获取客户端的Socket
            Socket socket = serverSocket.accept();
while (true){
    InputStream inputStream = socket.getInputStream();


    byte[] bytes = new byte[1024];//接收字节
    int len = inputStream.read(bytes);//读取长度

    //获得ip地址
    InetAddress inetAddress = socket.getInetAddress();
//        4. 读取客户端的数据, 打印出来
    System.out.println(inetAddress+":"+ new String(bytes,0,len));

//           (可以向客户端写数据)
//        5. 创建输出流对象
    OutputStream outputStream = socket.getOutputStream();

//        6. 写入输出的数据
    outputStream.write("服务器收到".getBytes());
}
//           ( 读取客户端数据 )
//           3. 创建输入流对象




//        7. 释放资源


    }
}

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

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

相关文章

【VMware相关】VMware vSphere存储方案

一、iSCSI存储 参考文档 VMware官方文档:配置iSCSI适配器和存储 华为配置指南:VMware ESXi下的主机连通性指南 1、配置说明 如下图所示,VMware配置iSCSI存储,需要将物理网卡绑定到VMKernel适配器上,之后再将VMKernel适…

微信开发者工具真机调试连接状态在正常和未连接之间反复横跳

开启局域网模式能解决这个问题,目前只找到这一个方法

测试新人如何去开展软件测试工作

1. 软件测试 在一般的项目中,一开始均为手动测试,由于自动化测试前期投入较大,一般要软件项目达到一定的规模,更新频次和质量均有一定要求时才会上自动化测试或软件测试。 1.1. 项目中每个成员的测试职责 软件测试从来不是某一个职…

微信小程序自定义顶部导航栏的胶囊和微信自带的胶囊一样的透明背景色

想要实现微信自带的右上角胶囊背景透明很简单,只需要在pages.js里面设置下面配置就可以了: "navigationStyle": "custom","navigationBarTextStyle": "white" 但是设置完这个后,胶囊的背景色是那种…

业余爱好-社会工程管理记账报税

税务问题笔记 印花税税费申报及缴纳财务和行为税合并纳税申报增值税及附加税费申报企业所得税季度A类申报残疾人就业保障金申报财务报表个税申报 印花税 印花税是对在经济活动和经济交往中书立、领受具有法律效力的凭证的行为征收的一种税。 税费申报及缴纳 财务和行为税合并…

JMeter怎样测试WebSocket

一、安装WebSocket取样器 1、从JMeter插件管理器官网下载: https://jmeter-plugins.org/ 搜索websocket 1、jetty-http-9.1.2.v20140210.jar 2、jetty-io-9.1.2.v20140210.jar 3、jetty-util-9.1.2.v20140210.jar 4、websocket-api-9.1.1.v20140108.jar 5、w…

DAPP开发【04】测试驱动开发

测试驱动开发(Test Driven Development),是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码&#xff0c…

SpringBoot集成邮箱验证码功能(注册/改密)

准备工作 开启SMTP服务 前往你的邮箱网站,以网易邮箱为例,打开网易邮箱地址,登录你的邮箱,进入邮箱管理后台界面。点击“设置”》》“POP3/SMTP/IMAP”后,点击开启SMTP服务即可。 技术实现 Spring Boot 发送邮件验证…

跨越鸿沟-颠覆性产品营销指南笔记

跨越鸿沟-颠覆性产品营销指南笔记 一、发现鸿沟 一、技术采用生命周期 技术采用生命周期 如果采用一个新产品,我们就得改变一贯的行为模式,或者改变我们依赖的其他产品或服务,那么,我们对技术采用的态度就变得很重要&#xff0c…

入门单片机和嵌入式必须学模电数电吗?

入门单片机和嵌入式必须学模电数电吗? 关于这个话题答案,不能一概而论,主要与从事的具体工作内容有关。 嵌入式开发,好多人认为硬件和软件都需要学习,其实不然。 嵌入式领域涵盖的内容很广,比如嵌入式MCU、…

【编译警告】start value has mixed support, consider using flex-start instead

css规范问题,flex布局下,justify-content:start; 应该为:justify-content: flex-start

深入探索Maven:优雅构建Java项目的新方式(二)

Meven高级 1,属性1.1 属性1.1.1 问题分析1.1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version 1.2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效 1.3 版本管理 2,…

【Python表白系列】无限弹窗,满屏表白代码来啦(完整代码)

文章目录 满屏表白代码环境需求完整代码详细分析系列文章 满屏表白代码 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需…

什么是勒索软件

勒索软件 1. 定义2. 勒索软件的类型3. 勒索软件的工作方式4. 如何处置勒索软件 1. 定义 勒索软件又称勒索病毒,是一种特殊的恶意软件。勒索软件的特殊之处在于,它采用加密等技术手段限制受害者访问系统或系统内的数据(如文档、邮件、数据库、…

基于YOLOv8深度学习的钢材表面缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

【Skynet 入门实战练习】分布式 ID | 雪花算法 | 缓存设计 | LRU算法 | 数据库

文章目录 前言雪花算法LRU 算法缓存模块数据库测试逻辑 前言 本节实现了 分布式 ID 生成系统,采用雪花算法实现唯一 ID;实现缓存架构,采用 LRU (最近最少使用)算法。 雪花算法 分布式 ID 生成算法的有很多种&#x…

hadoop-3.3.5安装过程

准备资源三台虚拟机: 1)准备3台服务器(关闭防火墙、静态IP、主机名称) 2)安装JDK 3)配置环境变量 4)安装Hadoop 5)配置环境变量 安装虚拟机(略)--1台即…

四、C语言数据类型和变量

目录 1. 数据类型介绍 1.1 字符型 1.2 整型 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof 操作符 1.5.2 数据类型长度 2. signed 和 unsigned 3. 数据类型的取值范围 4. 变量 4.1 变量的创建 4.2 变量的分类 5. 算术操作符:、-、*、…

postman参数为D:\\audio\\test.mp3请求报错

报错信息 报错 java.lang.IllegalArgumentException: Invalid character found in the request target [/v1/audio/transcriptions?audioPathD:\\audio\\test.mp3 ]. The valid characters are defined in RFC 7230 and RFC 3986 解决方式 yml文件上放行指定字符 relaxed-pa…

【Docker】本地项目打包并发布到线上

部署python到docker 再把docker部署到服务器上 部署 Python 项目到 Docker 并将 Docker 容器部署到服务器通常需要执行以下步骤: 准备 Dockerfile: 在项目根目录创建一个名为 Dockerfile 的文件,该文件包含构建 Docker 镜像的指令。 # 设置…