Java研学-网络编程

2023-12-20 00:36
文章标签 java 编程 网络 研学

本文主要是介绍Java研学-网络编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 概述

  计算机网络:指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路和通信设备连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

  网络编程:在网络通信协议下,实现网络互连的不同计算机程序之间的数据交换,即通过网络程序基于互联网访问服务器的程序与资源

二 CS / BS (网络程序的两种结构)

1 CS结构

  客户机/服务器模式(2层),用户要使用的话,需要下载一个客户端,安装后就可以使用。客户端不仅仅是一些简单的操作,它也是会处理一些运算,业务逻辑的处理等

  第一层: 在客户机系统上结合了界面显示与业务逻辑;
  第二层: 通过网络结合了数据库服务器。

  优点:
  ① C/S架构的界面和操作可以很丰富。
  ② 安全性能高。(因为只有两层的传输)
  ③ 只需客户机和服务器两层交互,因此响应速度较快。

  缺点:
  ① 适用面窄,通常用于局域网中
  ② 用户群固定。程序需要安装才可使用,不适合面向一些不可知的用户。
  ③ 维护成本高,升级一次,则所有客户端的程序都需升级,移植性低不跨平台。

2 BS结构

   浏览器/服务器结构(3层),少数事务逻辑在前端实现,主要事务逻辑都在服务器端实现。B/S架构的系统无须特别安装,有Web浏览器即可,业务逻辑由服务端完成,客户端只负责界面渲染

   第一层表现层:主要完成用户和后台的交互及最终查询结果的输出功能。
   第二层逻辑层:主要是利用服务器完成客户端的应用逻辑功能。
   第三层数据层:主要是接受客户端请求后独立进行各种运算。

  优点:
  ① 客户端无需安装,有Web浏览器即可
  ② BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
  ③ BS架构无需升级多个客户端,升级服务器即可。可以随时更新版本,无需用户重新下载

  缺点:
  ① 在速度和安全性上需要花费巨大的设计成本
  ② 客户端服务器端的交互是请求-响应模式,通常需要刷新页面

三 网络通信三要素

1 IP地址

  互联网协议地址(Internet Protocol Address)要想让网络中的计算机能够被识别,就必须为每台计算机指定一个唯一的标识,通过改标识来找到相应的计算机,而IP就是这个标识。

① IP地址分类

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

  IPv6:IP地址需求量愈来愈大,IP的分配越发紧张。为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,这样解决了网络地址资源数量不够的问题。

② 域名:映射到某个ip的一组英文单词组合,为了更好记忆

常用命令

// 查看本机IP地址,在控制台输入:
ipconfig// 检查网络是否连通,在控制台输入:
ping 空格 IP地址/域名ping www.baidu.com
ping 192.168.34.1// 特殊的IP地址 -- 本机IP地址
127.0.0.1、localhost 

2 端口号

  网络通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,为了在网络通信中区分这些进程,设置了端口号
  IP地址可以唯一标识网络中的设备,端口号可以唯一标识设备中的进程(应用程序)
  端口号是用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

3 通信协议

① 网络通信协议

  通信协议是计算机必须遵守的规则,遵守规则,计算机才能进行通信。协议中对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。

② java.net

  java.net包中提供了两种常见的网络协议的支持:UDP和TCP

四 UDP协议

1 介绍

  UDP(User Datagram Protocol)是无连接通信协议,不建立逻辑连接。
  当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,直接发数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

2 特点

  面向无连接的协议,消耗资源小,通信效率高,通常用于音频、视频等数据传输,偶尔丢失一两个数据包,不会对接收结果产生太大影响
  但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
在这里插入图片描述

四 TCP协议

1 介绍

  TCP(Transmission Control Protocol)协议是面向连接的通信协议,即在传输数据前先在客户端和服务器端建立逻辑连接,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输。涉及数据安全不可丢失就是用TCP,BS底层就是用的TCP。

2 特点

① 面向连接的协议
② 建立连接,形成传输数据的通道。
③ 传输数据大小不受限制
④ 通过三次握手完成连接。
⑤ 通过四次挥手断开连接。
⑥ TCP是基于10流传输数据。
⑦ 因为需要建立连接,效率会稍低但是可靠协议

3 三次握手

三次握手
第一次握手:客户端询问服务器端是否在线
第二次握手:服务器端通知客户端在线,并询问客户端是否在线
第三次握手:客户端通知服务器,客户端还在线
建立连接通道,开始传输数据

4 四次挥手

四次挥手
第一次挥手:客户端请求断开连接
第二次挥手:服务器发送收到断开请求,将数据发送完
第三次挥手:服务器发送完数据,通知客户端正式断开连接
第四次挥手:客户端告知服务器确定断开连接并等待2MSL后断开连接

四 基于TCP的网络编程

1 成员与职责

客户端:

  向服务端程序发送数据,然后接收服务端返回的数据.

服务端:

  接收客户端程序发送的数据,并作出反馈.

2 客户端编程

步骤

① 创建一个连接某个服务端的Socket对象
② 从Socket中拿到输出流往服务端发送数据
③ 调用Socket对象对象shutdownOutput方法通知服务端数据发送完毕
④ 从Socket中拿到输入流获取服务端回馈的数据
⑤ 调用Socket对象对象shutdownInput方法通知服务端数据接收完毕
⑥ 关闭Socket对象

public class Client {public static void main(String[] args) {try {//1:创建一个连接某个服务端的Socket对象Socket socket=new Socket("127.0.0.1",8888);//2:从Socket中拿到输出流往服务端发送数据OutputStream os = socket.getOutputStream();os.write("你好,服务器端!".getBytes("utf-8"));//3:调用Socket对象对象shutdownOutput方法通知服务端数据发送完毕socket.shutdownOutput();//4:从Socket中拿到输入流获取服务端回馈的数据InputStream is = socket.getInputStream();int len=0;byte[] b=new byte[1024];while ((len=is.read(b))!=-1){System.out.println(new String(b,0,len,"utf-8"));}//5:调用Socket对象对象shutdownInput方法通知服务端数据接收完毕socket.shutdownInput();//6:关闭Socket对象socket.close();} catch (Exception e) {e.printStackTrace();}}
}

3 服务端编程

步骤

① 创建一个服务端对象(ServerSocket)
② 侦听客户端的连接,获取和客户端通信的Socket对象
③从Socket获取输入流,接收客户端发送的数据
④ 调用Socket对象对象shutdownInput方法通知客户端数据接收完毕
⑤ 从Socket中拿到输出流往客户端发送数据
⑥ 调用Socket对象对象shutdownOutput方法通知客户端数据发送完毕
⑦ 关闭Socket对象

public class Server {public static void main(String[] args) {try {// 1:创建一个服务端对象(ServerSocket)ServerSocket serverSocket=new ServerSocket(8888);// 2:侦听客户端的连接,获取和客户端通信的Socket对象Socket socket = serverSocket.accept();// 3:从Socket获取输入流,接收客户端发送的数据InputStream is = socket.getInputStream();int len=0;byte[] b=new byte[1024];while ((len=is.read(b))!=-1){System.out.println(new String(b,0,len,"utf-8"));}// 4:调用Socket对象对象shutdownInput方法通知客户端数据接收完毕socket.shutdownInput();// 5:从Socket中拿到输出流往客户端发送数据OutputStream os = socket.getOutputStream();os.write("我是服务器端,信息已收到".getBytes("utf-8"));// 6:调用Socket对象对象shutdownOutput方法通知客户端数据发送完毕socket.shutdownOutput();// 7:关闭Socket对象socket.close();} catch (Exception e) {e.printStackTrace();}}
}

4 注意事项

① 客户端与服务端都启动才能进行测试
② 服务端一般是长期开启的,服务端关闭则不能够为客户端提供服务

五 模拟Tomcat

1 模拟后台数据输出到浏览器

public class RequestHandler implements  Runnable{//socket对象传入private Socket socket;//有参构造public RequestHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//获取客户端输入的数据BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String info=null;while ((info=br.readLine())!=null){if ("".equals(info)){break;}System.out.println(info);//显示输入的数据}//告诉客户端接收完毕socket.shutdownInput();/*服务器端响应数据:需要展示浏览器页面*/PrintWriter out=new PrintWriter(socket.getOutputStream());out.println("HTTP/1.1 200 OK");out.println("Content-Type:text/html;charset=utf-8");out.println();out.println("<html><head></head><body>welcome to tomcat!123123213</body></html>");out.flush();//告诉客户端结束输出socket.shutdownOutput();socket.close();} catch (IOException e) {e.printStackTrace();}}
}

2 模拟tomcat测试

public class TomcatWork {public static void main(String[] args) {try {//创建服务器端对象ServerSocket serverSocket=new ServerSocket(8080);System.out.println("服务器端启动.....");while (true){Socket socket=serverSocket.accept();new Thread(new RequestHandler(socket)).start();}} catch (IOException e) {e.printStackTrace();}}
}

这篇关于Java研学-网络编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514264

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2