计算机网络编程

网络编程

文章目录

  • 网络编程
    • 1 计算机网络
      • 1.1 什么是网络
      • 1.2 什么是计算机网络
      • 1.3 计算机网络发展的四个阶段
    • 2 常用名词
      • 2.1 网络模型
        • 2.1.1 OSI模型
        • 2.1.2 TCP/IP模型
      • 2.2 网络协议
        • 2.2.1 TCP/UDP
        • 2.2.2 IP
      • 2.3 Port: 端口号
    • 3 计算机网络编程
      • 3.1 InetAddress类
      • 3.2 基于TCP的Socket网络编程
      • 3.3 基于UDP协议的Socket编程

1 计算机网络

1.1 什么是网络

概念:由点和线构成,表示诸多对象间的相互联系。

在这里插入图片描述

1.2 什么是计算机网络

概念:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路和通信设备连接起来的一种计算机系统。

在这里插入图片描述

作用:在网络操作系统、网络管理软件及网络通信协议的协同管理下,可以实现资源的共享和信息的高效传递。

常见的计算机网络

  • 互联网:(Internet)点与点相连
  • 万维网:(WWW – World Wide Web)端与端相连
  • 物联网:( IoT - Internet of things) 物与物相连

网络编程:让计算机与计算机之间建立连接、进行通信。

根据地理范围分类:局域网:一个学校、公司、机房。城域网:一个或多个城市。广域网:Internet

1.3 计算机网络发展的四个阶段

第一阶段(60年代初期到60年代中期)

计算机通信网络,特征是计算机与终端互联,实现远程访问。第一代计算机网络是有主机—通信线路—终端组成,只可算是计算机网络的雏形。

(1)具有远程通信功能的单机系统

Ø解决了多个用户共享主机资源的问题。终端为哑终端,没有自己的CPU、内存和硬盘,没有处能力。

Ø存在问题:主机负担重,通信费用高。

在这里插入图片描述

(2)具有远程通信功能的多机系统

Ø解决了主机负担重、通信费用昂贵的问题。

Ø存在问题:多个用户只能共享一台主机资源。

在这里插入图片描述

第二阶段(60年代中期到70年代中期):

采用分组交换技术实现计算机 — 计算机之间的通信,使计算机网络的结构、概念都发生了变化,形成了通信子网和资源子网的网络结构。

(1)第二代计算机网络是计算机网络的“形成与发展”阶段

(2)美国的ARPA网就是第二代网络的代表

主要问题:网络对用户不是透明的。

第三阶段(70年代中期到80年代末期):

现代计算机网络互连阶段,特征是网络体系结构的形成和网络协议的标准化。

在计算机通信系统的基础之上,重视网络体系结构和协议标准化的研究,建立全网统一的通信规则,用通信协议软件来实现网络内部及网络与网络之间的通信,通过网络操作系统,对网络资源进行管理,极大的简化了用户的使用,使计算机网络对用户提供透明服务 。

(1)局域网技术出现突破性进展。

Ø该阶段始于70年代末,这是按照ISO提出的OSI参考模型为指导性标准构建的计算机网络。

Ø第三代计算机网络是计算机网络的“成熟”阶段。

(2)第三代计算机网络的特点

Ø 网络体系结构的形成和网络协议的标准化

Ø 建立全网统一的通信规则

Ø 使计算机网络对用户提供透明服务

第四阶段 –高速、综合化网络:

该阶段始于80年代末,相继出现了快速以太网、光纤分布式数字接口(FDDI)、快速分组交换技术(包括帧中继、ATM)、千兆以太网、B-ISDN 等一系列新型网络技术,这就是高速与综合化计算机网络阶段。

Internet就是这一代网络的典型代表,已经成为人类最重要的、最大的知识宝库。第四代计算机网络属于计算机网络的“继续发展”阶段。

把计算机网络的发展分为4个阶段:

Ø第一代:面向终端的计算机网络

Ø第二代:计算机通信网络

Ø第三代:计算机互联网络

Ø第四代:宽带综合业务数字网(信息高速公路)

2 常用名词

2.1 网络模型

2.1.1 OSI模型

OSI(Open System Interconnection)开放式系统互联。

在这里插入图片描述

  • 应用层:应用层负责文件访问和管理、可靠运输服务、远程操作服务。(HTTP、FTP、SMTP)
  • 表示层:表示层负责定义转换数据格式及加密,允许选择以二进制或ASCII格式传输。
  • 会话层:会话层负责使应用建立和维持会话,使通信在失效时继续恢复通信。(断点续传)
  • 传输层:传输层负责是否选择差错恢复协议、数据流重用、错误顺序重排。(TCP、UDP)
  • 网络层:网络层负责定义了能够标识所有网络节点的逻辑地址。(IP地址)
  • 数据链路层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性。(MAC)
  • 物理层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线、光导纤维)
2.1.2 TCP/IP模型

TCP/IP模型:一组用于实现网络互连的通信协议,将协议分成四个层次。

在这里插入图片描述

  • 应用层:负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等。
  • 传输层:负责传送文本数据,主要协议是TCP、UDP协议。
  • 网络层:负责分配地址和传送二进制数据,主要协议是IP协议。
  • 接口层:负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、ADSL等等。

2.2 网络协议

2.2.1 TCP/UDP

通信协议:计算机之间通信的规范标准。

TCP协议:Transmission Control Protocol 传输控制协议

  • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。
  • 建立连接的过程需要三次握手,断开连接的过程需要四次挥手。

在这里插入图片描述

UDP协议:User Datagram Protocol 用户数据报协议

  • 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB。
  • 效率比TCP高,适合广播发送。
2.2.2 IP

IP协议:Internet Protocol 互联网协议/网际协议

  • 分配给互联网设备的数字标签(唯一标识)称为IP地址。

IP地址分为两种

IPV4:4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位整数可以转换为一个0~255的十进制整数。

IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16位整数可以转换为一个0~65535的十进制数。

IPV4的应用分类

  • A类:政府机构,1.0.0.1 ~ 126.255.255.254
  • B类:中型企业,128.0.0.1 ~ 191.255.255.254
  • C类:个人用户,192.0.0.1 ~ 223.255.255.254
  • D类:用于组播,224.0.0.1 ~ 239.255.255.254
  • E类:用于实验,240.0.0.1 ~ 255.255.255.254

回环地址:127.0.0.1,指本机,一般用于测试使用。查看IP命令:ipconfig 测试IP命令:ping D.D.D.D

2.3 Port: 端口号

端口号:在通信实体上进行网络通讯程序的唯一标识。

  • 一个程序可以占用多个端口号,但是一个端口号只能被一个程序使用。

端口分类:

  • 公认端口:0~1023
  • 注册端口:1024~49151
  • 动态或私有端口:49152~65535

常用端口:

  • MySql:3306 Oracle:1521 Tomcat:8080
  • SMTP:25 Web服务器:80、443 FTP服务器:21

3 计算机网络编程

3.1 InetAddress类

概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。

常用方法:

  • public static InetAddress getLocalHost() 获得本地主机地址对象
  • public static InetAddress getByName(String host) 根据主机名称获得地址对象
  • public static InetAddress[] getAllByName(String host) 获得所有相关地址对象
  • public String getHostAddress() 获取IP地址字符串
  • public String getHostName() 获得IP地址主机名

代码演示:

public class TestInetAddress {public static void main(String[] args) throws Exception{//1 表示本机InetAddress ia1 = InetAddress.getLocalHost();System.out.println("ip地址:"+ia1.getHostAddress()+"主机名:"+ia1.getHostName());InetAddress ia2 = InetAddress.getByName("10.9.48.125");System.out.println("ip地址:"+ia2.getHostAddress()+"主机名:"+ia2.getHostName());InetAddress ia3 = InetAddress.getByName("127.0.0.1");System.out.println("ip地址:"+ia3.getHostAddress()+"主机名:"+ia3.getHostName());InetAddress ia4 = InetAddress.getByName("localhost");System.out.println("ip地址:"+ia4.getHostAddress()+"主机名:"+ia4.getHostName());//2 表示局域网地址System.out.println("-----------------");InetAddress ia5 = InetAddress.getByName("10.9.48.167");System.out.println("ip地址:"+ia5.getHostAddress()+"主机名:"+ia5.getHostName());//3 表示外网地址InetAddress ia6 = InetAddress.getByName("www.mihoyo.com");System.out.println("ip地址:"+ia6.getHostAddress()+"主机名:"+ia6.getHostName());InetAddress[] allByName = InetAddress.getAllByName("www.mihoyo.com");for (InetAddress inetAddress : allByName) {System.out.println(inetAddress.getHostAddress());}}
}

3.2 基于TCP的Socket网络编程

  • Socket(套接字)由操作系统提供的统一网络编程接口,是网络中的一个通信节点。
  • TCP协议分为客户端Socket与服务器ServerSocket。
  • 通信要素:IP地址 + 端口号。

开发步骤

  • 服务器端

    • (1) 创建ServerSocket对象,并指定端口号

    • (2) 侦听客户端连接,返回客户端套接字

    • (3) 获取输入输出流

    • (4) 处理数据

    • (5) 关闭资源

代码演示:

public class TcpServer {public static void main(String[] args) throws Exception{//1 创建serverSocket 套接字对象,并指定端口号ServerSocket listener=new ServerSocket(10086);System.out.println("服务器已启动...");//2 侦听客户端连接,并返回客户端套接字,注意: accept()阻塞方法, 直到有客户端连接Socket socket = listener.accept();//3 获取输入,输出流InputStream is = socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));OutputStream os = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));//4 处理数据//4.1 接收String data = br.readLine();System.out.println("客户说:"+data);//4.2 回复bufferedWriter.write("老地方见...");bufferedWriter.newLine();bufferedWriter.flush();//5关闭br.close();bufferedWriter.close();socket.close();listener.close();}
}
  • 客户端

    • (1)创建客户端套接字,并指定服务器的地址和端口号

    • (2)获取输入输出流

    • (3)处理数据

    • (4)关闭资源

public class TcpClient {public static void main(String[] args) throws Exception{//(1)创建客户端套接字,并指定服务器的地址和端口号Socket socket = new Socket("10.9.48.175",10086);//(2)获取输入输出流OutputStream os = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));InputStream is = socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));//(3)处理数据//3.1 写入bufferedWriter.write("好久不见...");bufferedWriter.newLine();bufferedWriter.flush();//3.2 读取String reply = br.readLine();System.out.println("服务器回复:"+reply);//(4)关闭资源bufferedWriter.close();br.close();socket.close();}
}

课堂案例

TCP编程实现客户端上传文件给服务器端

代码演示

TestFileServer:

public class TestFileServer {public static void main(String[] args) throws IOException {//1 创建ServerSocket listener = new ServerSocket(10010);//2 监听用户请求Socket socket = listener.accept();//3 获取输入流InputStream inputStream = socket.getInputStream();BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);//4 处理FileOutputStream fileOutputStream = new FileOutputStream("e:\\111.png");byte[] bytes = new byte[1024 * 4];int len = -1;while ((len=bufferedInputStream.read(bytes))!=-1) {fileOutputStream.write(bytes,0,len);}//5 关闭fileOutputStream.close();bufferedInputStream.close();socket.close();listener.close();System.out.println("接受完毕...");}
}

TestFileClient:

public class TestFileClient {public static void main(String[] args) throws Exception{//1 创建Socket socket = new Socket("10.9.48.124", 10010);//2 获取OutputStream outputStream = socket.getOutputStream();BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);//3 处理FileInputStream fileInputStream = new FileInputStream("E:\\QianFeng\\分享演讲\\排球队视频_end.mp4");byte[] bytes = new byte[1024 * 4];int len;while ((len=fileInputStream.read(bytes))!=-1) {bufferedOutputStream.write(bytes,0,len);}bufferedOutputStream.flush();//4 关闭bufferedOutputStream.close();fileInputStream.close();socket.close();System.out.println("发送完毕...");}
}

TCP实现多个客户端发送数据给服务器端

代码演示

ChatServer:

public class ChatServer {public static void main(String[] args) throws IOException {ServerSocket listener = new ServerSocket(11008);System.out.println("聊天室已启动...");ExecutorService es = Executors.newCachedThreadPool();while (true) {Socket socket = listener.accept();System.out.println(socket.getInetAddress().getHostAddress()+"进入聊天室...");//开启子线程来接收数据es.submit(new HandleSocket(socket));}}static class HandleSocket implements Runnable {private final Socket socket;public HandleSocket(Socket socket) {this.socket = socket;}@Overridepublic void run() {if (socket != null) {BufferedReader br = null;try {InputStream is = socket.getInputStream();br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));String data;while ((data = br.readLine())!=null) {System.out.println(socket.getInetAddress().getHostAddress()+"说:"+data);}System.out.println(socket.getInetAddress().getHostAddress()+"正常退出了聊天室...");} catch (Exception e) {System.out.println(socket.getInetAddress().getHostAddress()+"异常退出了聊天室...");} finally {try {br.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
}

ChatClient:

public class ChatClient {public static void main(String[] args) throws IOException {//1 创建Socket socket = new Socket("10.9.48.185", 9999);//2 获取输出流OutputStream os = socket.getOutputStream();BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));//3 处理Scanner input = new Scanner(System.in);while (true) {String data = input.next();bw.write(data);bw.newLine();bw.flush();if (data.equals("over")) {break;}}bw.close();socket.close();}
}

3.3 基于UDP协议的Socket编程

  • DatagramSocket:数据包套接字 (快递站)
  • DatagramPacket:数据报包,用来发送或接收数据包。(快递包裹)

开发步骤

  • 接收方
    • 创建DatagramSocket对象,并指定端口
    • 创建接收数据报包 DatagramPacket
    • 接收处理
    • 关闭资源

代码演示:

public class Receiver {public static void main(String[] args) throws Exception {//1创建DatagramSocket 对象DatagramSocket ds = new DatagramSocket(6666);//2创建接收数据报包byte[] buf = new byte[1024 * 64];DatagramPacket dp = new DatagramPacket(buf, buf.length);//3接收 ,阻寨方法,直到接收到数据报包System.out.println("准备接收.......");ds .receive(dp);//4处理// dp.getData() 接收的数据// dp.getLength() 际接收的数据长度String data = new String(dp.getData(),0,dp.getLength());System.out.println("发送说:" + data);//5关闭ds.close();}
}
  • 发送方
    • 创建DatagramSocket对象,默认随机绑定一个端口号
    • 创建发送数据报包 DatagramPacket
    • 发送
    • 关闭资源

代码演示:

public class Sender {public static void main(String[] args) throws Exception{//1创建 DatagramSocket对象,随机绑定一个端口号DatagramSocket ds = new DatagramSocket();//2创建发送数据报包String s="好久不见";DatagramPacket dp=new DatagramPacket(s.getBytes(),//发送数据s.getBytes().length,//发送数据的长度InetAddress.getByName( "10.9.48.175"),//对方ip地址6666); //对方端口号//3 发送ds . send(dp);//4关闭ds.close();}
}

课堂案例

使用UDP实现广播发送

代码演示:

ChatReceiver:

public class ChatReceiver {public static void main(String[] args) throws Exception{//1创建Datagramsocket对象DatagramSocket ds=new DatagramSocket(8888);//2创建接收数据报包byte[] buf=new byte[1024*64];DatagramPacket dp=new DatagramPacket(buf,buf.length);//3接收System.out.println("聊天室已启动...");while(true) {ds.receive(dp);//4处理String data = new String(dp.getData(), 0, dp.getLength());System.out.println(dp.getAddress().getHostAddress() + "说:" + data);}//5关闭//ds.close();}
}

ChatSender:

public class ChatSender {public static void main(String[] args) throws Exception {DatagramSocket ds=new DatagramSocket();Scanner input=new Scanner(System.in);while(true) {String data=input .next();//2创建发送教据报包DatagramPacket dp=new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getByName("10.9.48.255"),//10.9.48.255 广播地址8888);//3发送ds.send(dp);if(data.equals("over")){break;}//4关闭ds.close();}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞_Java开发手册_(六)工程结构

文章目录 工程结构的意义(一) 应用分层(二) 二方库依赖(三) 服务器 🙊前言:本文章为瑞_系列专栏之《Java开发手册》的工程结构篇,主要介绍应用分层、二方库依赖、服务器。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c…

前端面试题汇总大全(含答案)-- 持续更新

​一、HTML 篇 1. 简述一下你对 HTML 语义化的理解? 用正确的标签做正确的事情。 html 语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;即使在没有样式 CSS 情况下也以一种文档格式显示,并且是容易…

Puppeteer让你网页操作更简单(2)抓取数据

Puppeteer让你网页操作更简单(1)屏幕截图】 示例2 —— 让我们抓取一些数据 现在您已经了解了Headless Chrome和Puppeteer的工作原理基础知识,让我们看一个更复杂的示例,其中我们实际上可以抓取一些数据。 首先,请查看此处的Puppeteer API文档。如您所见,有大量不同的方法我…

计算机毕业设计 基于SSM的历史/博物馆藏系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Linux粘滞位的理解,什么是粘滞位?

文章目录 前言如何理解?粘滞位的操作最后总结一下 前言 粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root…

Dubbo-admin监控中心

监控中心 Dubbo-admin监控中心执行操作启动provider和consumer项目进行测试总体流程 Dubbo-admin监控中心 dubbo-admin下载路径 git clone https://github.com/apache/dubbo-admin.git图1-1 dubbo-admin项目文件展示 执行操作 # 启动zookeeper# 前端 cd dubbo-admin-ui npm i…

多模态融合的基础问题及算法研究

🌞欢迎来到深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误&#xff…

C++--默认参数

一.默认参数🍗 C中允许函数提供默认参数,也就是允许在函数的声明或定义时给⼀个或多个参数指定默认值。在调 ⽤具有默认参数的函数时,如果没有提供实际参数,C将⾃动把默认参数作为相应参数的值。 二.使用规则🍗 1.如果…

Spring Web文件上传功能简述

文章目录 正文简单文件上传文件写入 总结 正文 在日常项目开发过程中,文件上传是一个非常常见的功能,当然正规项目都有专门的文件服务器保存上传的文件,实际只需要保存文件路径链接到数据库中即可,但在小型项目中可能没有专门的文…

Spring中动态注册和销毁对象

1. 使用说明 通常我们项目中想要往spring容器中注入一个bean可以在项目初始化的时候结合Bean注解实现。但是该方法适合项目初始化时候使用,如果后续想要继续注入对象则无可奈何。本文主要描述一种在后续往spring容器注入bean的方法。 2. 实现 2.1 说明 2.1.1 注册…

「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解

引言:CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种攻击技术,通过使用用户的身份进行不诚实地操作,恶意用户可以在受害者(目标)的机器上执行一些未授权的操作。这可能会危及…

FairyGUI Day 1 导入FairyGUI

FairyGUI Unity3d引擎版本:Uinty3d 20233.2.3f1 1、从资产商店中将FairyGUI购入我的资产中,目前是免费的。 2、从我的资产中将FairyGUI导入到当前项目中。 3、我遇到的问题,我的Assets下有两个文件夹分别是Resources和Scenes,导…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP 地…

pytest + allure(windows)安装

背景 软硬件环境: windows11,已安装anaconda,python,pycharm用途:使用pytest allure 生成报告allure 依赖java,点击查看java安装教程 allure 下载与安装 从 allure下载网址下载最新版本.zip文件 放在自…

Android Dialog setCanceledOnTouchOutside失效,点击dialog外面不消失

前言:有一个需求需要点击dialog外面要消失,本来以为很简单结果设置了一直未生效 setCanceledOnTouchOutside(true); 问了半天chat-gpt4结果给的答案都不明显 查看代码发现设置了style,于是尝试去除这个style,结果点击setCancele…

蓝桥杯回文日期判断

思想:对于回文数的判断方法,最快的就是取其中一半的字符串长度,为s,然后将其进行翻转为s’ ,再把两者进行拼接即可保证是回文数,这样子就解决了枚举所有回文数的问题。 注意点: 要求必须是有效…

SQL Server中数据表的增删查改

文章目录 一、增二、查三、改四、删除 一、增 进行增删查改的前提需要在指定数据库中创建数据表,对这块不大理解的可以先看看前面几期文章: 创建数据库 创建数据表 use StudentManageDB go insert into Students (StudentName,Gender,Birthday,Age,Stu…

如何使用万能头 #include<bits/stdc++.h>

准备蓝桥杯的时候看到了很多头文件包含了这个头文件,后来查了一下 它是C中支持的一个几乎万能的头文件,几乎包含所有的可用到的C库函数。以后写代码就可以直接引用这一个头文件了,不需要在写一大堆vector、string、map、stack…… 我们该如何…

JavaScript基础语法

速通回顾一遍 引入方式 一般会把<script>标签置于<body>元素底部&#xff0c;改善显示速度&#xff1a; 内部脚本&#xff1a;<script></script>标签内外部脚本&#xff1a;<script src""></script>配置src 外部js文件中&…

数据库-数据库分类

数据库可以分为关系型数据库和非关系型数据库&#xff0c;常见的数据库如下 关系型数据库 关系型数据库是一种采用关系模型来组织数据的数据库&#xff0c;它以行和列的形式存储数据&#xff0c;以便于用户理解。关系型数据库中的数据以二维表的形式组织&#xff0c;被称为表…