java——网络编程

什么是计算机网络

        把分布在不同地理区域的计算机设备,通过通信设备和线路(网线,光纤,交换机)连接,最终实现数据的传输和资源的共享。

实现不同计算机之间的联系,必须有介质连接

最早的网络:美国五角大楼一间办公室,后来一栋楼,然后一个城市,一个国家,全球

网络编程

在网络的基础上,开发的程序能够进行数据传输

Java语言是支持网络的

Java语言将网络连接的细节都封装起来了,对外提供一套网络库(类),就可以进行统一环境的网络编程

进行网络数据传输的核心问题

1.如何找到网络世界中的目标主机和程序(IP和端口)

2.找到后如何高效安全的进行数据传输(协议)

网络模型

应用层

QQ,微信等

传输层

加入协议控制

网络层

IP  协议控制

物理层

网线 光纤

三要素:IP地址  端口  协议

IP(Internet Protocol Address)

是指互联网协议地址,计算机的地址

电脑地址在命令提示符中输入 ipconfig 查找

局域网ip 192.168.

本机回环地址 127.0.0.1 访问自己电脑 

端口

计算机中运行的每个程序都对应分配一个整数编号,不能重复

0~1024系统使用或保留的端口  0~65535为有效的端口号   

协议(规则 规范 约定)

规定传输的速率,代码结构,出错后如何应对等等规则

java中的两种协议下的编程

TCP

传输控制协议TCP(Transmission Control Protocol)

客户端向服务器端发送数据前,首先要建立连接(测试网络是否通畅)

        三次握手机制

正式传输数据

        传输完毕,需释放已建立的连接,效率低

断开时还要相互确认

        四次挥手

特点:可靠安全,但是效率相对于UDP较低

三次握手

步骤:

1.客户端向服务器端发送链接请求

2.当服务器收到客户端链接请求后,给客户端做出一个回应

3.客户端为服务器的回应做出确认回应

4.开始传输数据

四次挥手

步骤:

1.客户端向服务器端发送断开请求

2.服务器向客户端做出一个回应

3.服务器把没有传完的数据传输完毕,再向客户端做出回应

4.客户端向服务器端回应做出回应

5.断开

UDP

用户数据报协议UTP(User Datagram Protocol)

把要发送的数据封装成一个数据报(数据包),数据包包含数据,对方的ip,对方端口。

只管发送即可,是否发送成功是不知道的

特点:是不可靠的,但传输效率高 

标志位

URG:紧急指针有效;

ACK:确认序号有效;

PSH:接收方应该尽快将这个报文交给应用层;

RST:重置连接;

SYH:发起一个新连接;

FIN:释放一个连接;

TCP编程和UDP编程

TCP编程

服务器程序的工作过程包含以下四个基本的步骤:

调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。

调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。

调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。

关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

服务器

服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象

ServerSocket serverSocket = new ServerSocket(52013);

52013:端口,须在1024到65535之间

传输方法

字节流

IntputStream

OutputStream

​public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(52013);
            System.out.println("服务器启动成功!");
            //监听客户端是否发送链接请求到服务器
            Socket socket = serverSocket.accept();//阻塞了,监听客户端的连接
            System.out.println("有客户端连接到服务器");
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[100];
            int size = inputStream.read(bytes);
            String s = new String(bytes,0,size);
            System.out.println(s);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("服务器启动失败,端口已被占用");
        }
    }
}

包装流 能直接读到一个字符串

DataIntputStream

DataOutputStream

public class Server {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            ServerSocket serverSocket = new ServerSocket(9810);
            System.out.println("服务器启动成功!");
            //监听客户端是否发送链接请求到服务器
            Socket socket = serverSocket.accept();//阻塞了,监听客户端的连接
            System.out.println("有客户端连接到服务器");
            while (true){
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                String s = dataInputStream.readUTF();
                System.out.println(s);

            //从服务器向客户端发送信息
                String s1 =scanner.next();
                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataOutputStream.writeUTF(s1);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("服务器启动失败,端口已被占用");
        }
    }
}
客户端

Socket socket = new Socket("127.0.0.1",52013);

"127.0.0.1":IP地址,连接网络不同时会产生不同的IP地址,127.0.0.1 是主机回环地址

50213:端口,需要与创建的服务器端口相同

传输方法

字节流

IntputStream

OutputStream

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",52013);
            String s = "你干嘛~哈哈~哎哟";
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(s.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

包装流 能直接读到一个字符串

DataIntputStream

DataOutputStream

public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            Socket socket = new Socket("127.0.0.1",9810);
            while (true){
                //向服务器传输信息
                String s = scanner.next();
            /*OutputStream outputStream = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);*/
            //可简化为
                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataOutputStream.writeUTF(s);
                //接收服务器传输的信息
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                String s1 = dataInputStream.readUTF();
                System.out.println(s1);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP编程

流 程:

1. DatagramSocket与DatagramPacket

2. 建立发送端,接收端

3. 建立数据报

4. 调用Socket的发送、接收方法

5. 关闭Socket

发送端与接收端是两个独立的运行程序

发送端
import java.io.IOException;
import java.net.*;

public class UdpSend {
    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket = new DatagramSocket();//负责发送数据报

            byte[] bytes = "你干嘛,唉呦".getBytes();//发送的数据

            //封装一个数据报
            DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length, InetAddress.getByName("127.0.0.1"),6666);
            datagramSocket.send(datagramPacket);
            //datagramSocket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceive {
    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket = new DatagramSocket(6666);
            //封装一个数据报对象,用来接收数据
            byte[] bytes = new byte[100];//用来分装数据
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            datagramSocket.receive(datagramPacket);//真正的接收数据
                                                                   // 实际接收到的数据长度
            String s = new String(datagramPacket.getData(),0,datagramPacket.getLength());
            System.out.println(s+"——"+datagramPacket.getAddress());
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

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

相关文章

Go语言不能常量取址!?

题如下图 在软件开发中,常量是一种重要的编程元素,它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中,常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如: const a …

WinRAR功能之【锁定压缩文件】

今天来分享一下WinRAR解压缩软件的“锁定压缩文件”功能,这个功能可以保护压缩包里文件的完整性,也就是不能随意增加、删除以及修改压缩包里的文件。我们可以用两种方式来设置,一起来看看吧! 方式1:在压缩文件的时候&a…

Gretel引领革命:发布全球最大开源Text-to-SQL数据集,开启AI培训新篇章|TodayAI

在合成数据行业中处于领先地位的Gretel公司,近日宣布了一项重大突破,推出了世界上最大的开源Text-to-SQL数据集,这一举措将加速AI模型的培训过程,并为全球各行各业的企业解锁新的可能性。 这个数据集包含了超过100,000个精心制作…

msvcp140.dll文件丢失能有什么办法可以解决,提供几种解决办法

哦豁!当您打开计算机或想要启动某个应用程序时,意外地弹出一个令人不安的错误提示:“msvcp140.dll文件不见啦!”这意味着您的操作系统找不到名为“msvcp140.dll”的重要文件,可能导致一些应用程序无法正常运行。但是别…

集合类多线程(JUC)

一、集合框架概述 集合: 是广义上的集合,简单理解就是容器。注意:集合只能存放对象类型的数据。 集合框架: 指的是 java.util 包中定义的各种容器类、相关的工具类、接口的统称。不同的容器存储不同结 构的数据。使用时要进行导包…

智慧园区水电能源监控管理系统

随着智慧城市的快速发展,智慧园区作为城市智能化的重要组成部分,其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统,是利用先进的信息技术和自动控制技术,对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

React 开发者必备技能之Redux基础入门实例

首先,我们需要安装 Redux 及其相关依赖: npm install redux react-reduxredux 是 Redux 库的核心部分,提供了创建 Store、Reducer、Action 等功能。react-redux 是 React 和 Redux 的集成库,用于在 React 组件中使用 Redux。 安装完成后,我们开始创建 Redux 应用程序: 创建 …

HarmonyOS 应用开发-应用异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法,主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明: 点击构建应用崩溃事件,3s之后应用退出,然后打开应用进入应用异常页面&#x…

分享|创业老阳推荐的Temu蓝海项目到底怎么样?

在当今竞争激烈的创业市场中,寻找一个具有潜力的蓝海项目成为了众多创业者的梦想。近日,创业老阳推荐的Temu蓝海项目引起了广泛关注。那么,这个项目到底怎么样呢?让我们一起来探讨一下。 首先,Temu蓝海项目在定位上具有显著优势 …

【数组】【最长距离】使循环数组所有元素相等的最少秒数

本文涉及知识点 数组 最长距离 LeetCode2808. 使循环数组所有元素相等的最少秒数 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒,你可以对数组执行以下操作: 对于范围在 [0, n - 1] 内的每一个下标 i ,将 nums[i] 替换成 nums[i] …

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:(1)训练初始数据&…

初识Python(注释、编码规范、关键字...)

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合…

2024年软考考纲改版后考试难度如何?

请注意:2024年软考只有两个资格的考纲发生了变化,分别是系统集成项目管理工程师(中项)和信息系统监理师,而且变化将在2024年下半年开始执行。其它资格的考纲保持不变! 准备参加软考或者已经在备考的考生们…

什么时候考虑使用全局状态管理?vue获取全局状态变量一共有三种方法,你真的理解吗?

同学们可以私信我加入学习群! 正文开始 前言一、场景二、设置state中的变量三、直接访问state中的变量四、通过getters访问变量五、通过actions访问变量六、总结总结 前言 本文给大家做个参考,什么时候会考虑使用全局状态管理?以及帮助大家理…

vue+springboot实现JWT登录验证

目录 前言概念实际演示路由信息初始访问登录界面登录验证验证过期 vue实现依赖引入main.js获取和设置token工具类登录方法实体登录方法axios请求 router配置 springboot实现依赖引入JWT工具类忽视jwt验证注解拦截器逻辑跨域&调用拦截器配置登录接口&验证token接口 结语…

初识SpringMVC

一、什么是MVC MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块: M:Model(模型)V:View&#xff08…

自定义类型:结构体,位端

结构体内存对齐 结构体的对齐规则: 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 Linux中没有默…

【Shell】各种条件语句的使用——test语句、if语句、case语句

Shell条件语句的使用 条件语句 Shell条件语句的使用条件测试的语法字符串测试表达式整数二元比较操作符逻辑操作符 if的条件语句的语法if的嵌套case语句语法 条件测试的语法 语法1&#xff1a;test <测试表达式> 利用test命令进行条件测试表达式的方法。test命令与<测…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

深入浅出 -- 系统架构之微服务标准组件及职责

我们来认识一下微服务架构在Java体系中依托哪些组件实现的。 相对于单体架构的简单粗暴&#xff0c;微服务的核心是将应用打散&#xff0c;形成多个独立提供的微服务&#xff0c;虽然从管理与逻辑上更符合业务需要。但微服务架构也带来了很多急需解决的核心问题&#xff1a; 1…