JavaEE|网络编程基础与Socket套接字

news2024/11/15 19:35:15

文章目录

    • 一、为什么需要网络编程
    • 二、什么是网络编程
    • 三、网络编程中的基本概念
      • 1.发送端和接收端
      • 2.请求和响应
      • 3.客户端和服务端
      • 4.常见的客户端服务端模型
    • 四、Socket套接字概念及分类
      • 1.概念
      • 2.分类
        • 1)流套接字:使用传输层TCP协议
        • 2)数据报套接字:使用传输层UDP协议
        • 3)原始套接字
    • 五、Java数据报套接字通信模型
    • 六、Java流套接字通信模型
    • 七、Socket编程注意事项

一、为什么需要网络编程

在网络上可以获取的各种数据资源就叫做网络资源。

我们可以通过上网,查询到我们想要的资源,而这些丰富的网络资源就是通过网络编程来进行传输的。

与本地打开视频资源类似,只是视频文件资源的来源是网络。相比本地资源,网络提供了更为丰富的网络资源,比如视频资源、图片资源、文本资源等。

二、什么是网络编程

网络编程就是网络上的主机通过不同的进程以编程的方式实现网络通信/网络数据传输。

这就意味,网络编程可以是,不同主机上的不同进程进行通信,也可以是同一台主机上的不同进程进行通信。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cW5nRfUg-1676714467290)(F:\typora插图\image-20230218105507184.png)]

简言之,网络编程就是不同进程通过网络进行通信。

进程A:编程来获取资源

进程B:编程来发送/提供资源

这里边的核心就是学习Socket Api。是和传输层密切相关的。传输层提供了两个最核心的协议——udp\TCp,他对应的也提供了两种风格,udp和tcp(第三种风格的是unix领域的套接字,现在早就没人用了)

Socket英译就是插座,这里我们的术语翻成了套接字(有一定历史背景,但是我不知道)

网络编程本质上就是操作网卡。

三、网络编程中的基本概念

1.发送端和接收端

一次网络数据传输时:

发送端:数据的发送方进程,称为发送端。对应的发送端主机就是网络通信中的源主机。

接收端:数据的接收方进程,称为接收端。对应的接收端主机即网络通信中的目的主机。

收发端:发送端和接收端两端,也简称为收发端。

注意:收发端是相对的,或者说是由网络数据传输流向决定的,主动的就是发送端,被动的就是接收端。

2.请求和响应

一般,获取一个网络资源,涉及到两次网络数据传输。第一次就是请求,第二次就是响应。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuwCey69-1676714467292)(F:\typora插图\image-20230218110309840.png)]

3.客户端和服务端

在上述网络通信过程中,主机A的进程是获取服务/资源的一方,也称为客户端,主机B的进程是提供服务/资源的一方,也称为服务器。

4.常见的客户端服务端模型

最常见的场景,客户端是指给用户使用的程序,服务端是提供用户服务的程序:

  1. 客户端先发送请求到服务端
  2. 服务端根据请求数据,执行相应的业务处理
  3. 服务端返回响应:发送业务处理结果
  4. 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)

四、Socket套接字概念及分类

1.概念

Socket套接字就是由系统提供用于网络通信的技术。

Socket套接字是基于TCP/IP协议进行网络通信的基本操作单元。

网络编程就是基于Socket套接字的网络程序开发。

2.分类

套接字是传输层专有的吗?它跟整套TCP/IP协议栈又有什么关系??

1)流套接字:使用传输层TCP协议

TCP:即Transmission Control Protocol,传输控制协议。是传输层协议的一种。

TCP的特点:有连接、可靠传输、面向字节流、全双工

对于这里的有连接:

需要连接建立了才能通信。

对于这里的可靠传输:

发送方能知道自己的消息是不是发过去了还是丢了。

对于这里的面向字节流:传输数据是基于IO流。

流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据、可多次发送也可分开多次接受。和文件io/读写类似。

对于这里的全双工:

全双工:一个通信通道可以双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

半双工:一个通信通道只允许单向传输(A→B或B→A)。

为什么tcp和udp都是全双工的?

一根网线其实有8根线,有的负责上传有的负责下载,相当于8车道。

不只是这里,整个计网大部分情况还是全双工

宿舍的网不改成半双工用不了:

与路由器和交换机配置有关

关于网速

与传输的数据量(类比马路上跑的车辆)和带宽(类比马路的宽度)有关系。

网络转发设备的转发能力是有上限的,他们转发的数据不只是我们自己的数据。一旦其中一个设备有问题,就会慢。

上传比下载慢:是运营商的问题(上行带宽),下行带宽(一般都快于上行带宽)

百度网盘是属于软件限速,和带宽没有关系。

idm是Internet download manager,好像是能提高下载速度,一般是浏览器插件。

2)数据报套接字:使用传输层UDP协议

UDP:即User Datagram Protocol(用户数据报协议)。一种传输层协议。

UDP特点:无连接、不可靠传输、面向数据包、全双工

对于这里面向数据包:

可以理解为数据包为基本的收发单位。一个数据报可能是好几个字节。数据量大了,就多弄几个数据包,但是即使是数据量少了,比如一个字节,也不能说不包裹直接发送,必须封装成数据包进行发送。

3)原始套接字

原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。 是在unix角度来讲的,现在很少用。。

仅作了解即可。

五、Java数据报套接字通信模型

对于UDP协议来讲,每次通信都不需要进行连接,并且一次发送全部数据,一次接收全部数据。

????Java中使用UDP协议进行通信,主要基于DatagramSocket类创建数据报套接字,基于DatagramPacket类对象来作为发送/接受UDP数据报。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfyJUHov-1676714467292)(F:\typora插图\image-20230218124914699.png)]

六、Java流套接字通信模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9izft4N-1676714467293)(F:\typora插图\image-20230218124741841.png)]

七、Socket编程注意事项

  • 客户端和服务器:开发时,经常时基于一个主机开启两个进程作为客户端和服务器;应用时,一般是不同主机的分别作为客户端和服务器

  • 目的ip和目的端口号:两者分别表示了一次数据发送过程中要发送数据的终点主机(因为实际上一次数据传输过程中一般需要经过很多路由器等网络设备)和终点进程。

  • Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议,也需要考虑,这块我们在后续来说明如何设计应用层协议

  • 端口号和socket对象是多对一的

  • 端口被占用:即进程B试图绑定一个已经被另一个进程A绑定的端口号。此时会报这样的错误信息。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Blc10lOz-1676714467293)(F:\typora插图\image-20230218130019650.png)]

    解决办法:检查B进程试图绑定的端口号==>查看此端口号被哪个进程占用

    ·如果占用端口进程A不需要运行,就可以关闭A后,再启动需要绑定该端口的进程B

    ·如果需要运行,就修改进程B的绑定端口换成其他没有使用的端口。

    1. 在cmd输入 netstat -ano | findstr 端口号 ,则可以显示对应进程的pid。如以下命令显示了8888进程的pid

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCLvjJBI-1676714467293)(F:\typora插图\image-20230218130556585.png)]

    2. 在任务管理器(ctrl+alt+delete)中,通过pid查找进程

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R2q1qMbF-1676714467294)(F:\typora插图\image-20230218130930042.png)]

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

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

相关文章

LeetCode 430. 扁平化多级双向链表

原题链接 难度:middle\color{orange}{middle}middle 题目描述 你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一…

2023年前端面试知识点总结(JavaScript篇)

近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正! 1. JavaScript有哪些数据类型 总共有8种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt Null 代表的含义是空对象…

蓝图通讯之事件分发器用法

在事件分发器点 加号添加一个分发器 image.png在蓝图开始运行就进行绑定这个事件, image.png他会创建一个以分发器开头_事件的东西. 而绑定类似,只是没有创建和连接 image.pngimage.png然后 我们设置一个键触发这个逻辑. image.png最后验证多次输入多次触发,类似编程中的事件订…

【博客626】不同类型的ARP报文作用以及ARP老化机制

不同类型的ARP报文作用以及ARP老化机制 1、ARP协议及报文 2、不同类型的ARP报文作用 3、ARP工作原理 4、ARP老化机制 5、Linux ARP老化机制 ARP状态机: 在上图中,我们看到只有arp缓存项的reachable状态对于外发包是可用的,对于stale状态的…

excel应用技巧:F功能键诸多应用汇总

F1~F12,个个都是Excel操作的好帮手。单单一个F4键就有多种用法,其中第4种等间距复制图形,真的很神奇呀。利用快捷键可以代替鼠标做一些工作,也可以实实在在提高我们日常的工作效率,今天就先来跟大家一起分享…

数据结构与算法—队列

队列 队列介绍 有序列表,可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue new ArrayQueue(3);// 接收用户输入char key ;Scanner sc new Scanner(System.in);…

PyQt5 自定义富文本编辑器

介绍 一款使用PyQt5和网页端框架wangEditor集成的富文本编辑器 代码片段 PyQt5客户端 与网页端建立连接def create_connect(self):self.web_view QWebEngineView()self.bridge JSBridge(self.web_view.page())self.web_view.load(QUrl.fromLocalFile(self.editor_path))w…

现代卷积神经网络经典架构图

卷积神经网络(LeNet) LeNet 的简化版深层卷积神经网络(AlexNet) 从LeNet(左)到AlexNet(右)改进: dropOut层 - 不改变期望但是改变方差ReLU层 - 减缓梯度消失MaxPooling数…

2.18 设置language和中文输入法

文章目录一:设置language二:设置中文输入法一:设置language nvidia的开发板上默认只有English,需要点击如下管理: 接着进入如下界面: 此时图中的“汉语(中国)”应该是没有的&…

Kubernetes是个什么东东?

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语,意…

NoMachine 输入用户名密码后 闪断 解决办法

大家好,我是虎哥,最近工作忙,好长时间没有继续套件的深度学习,今天周六,难得有空,泡好茶,打开电脑,链接套件桌面,得,出问题了,一个很奇怪的问题&a…

[教你传话,表白,写信]

第一步 关注飞鸽传话助手 第二部 点击链接进入 第三步 点击发送,输入内容 第四步 就可以收到了

Simulink 自动代码生成电机控制:STM32 Encoder编码器使用总结

目录 Encoder 原理 STM32 Encoder 计数原理 模型仿真 模拟Encoder 基于Encoder计算角度和速度 关于启动的仿真 代码生成 运行演示 总结 总结一下基于STM32的Encoder接口的电机运行,相应的仿真和实验都是基于一个1024脉冲的增量式光电编码器,关于…

23年校招DL/NLP/推荐系统/ML/算法基础面试必看300问及答案

2020年校招已经开始了,在疫情全球肆虐的背景下,全球就业情况异常艰难,加上美国对中国企业打压持续升级,对于马上开始秋招找工作的毕业生而言,更是难上加难。我们不能凭一己之力改变现状,但我们可以凭借自己…

第七讲---贪心(上课)

1.股票买卖 一、贪心 考虑一种方案,在每次上升的前一天购入股票,并在上升后的当天卖出的方案 if (w[i] > w[i - 1])res w[i] - w[i - 1];接下来证明该贪心思路得出的方案即是最优解。 (1)证明贪心解 ≥ 最优解: …

剑指 Offer 39. 数组中出现次数超过一半的数字

摘要 剑指 Offer 39. 数组中出现次数超过一半的数字 一、摩尔投票法 核心理念票数正负抵消 。此方法时间和空间复杂度分别为 O(N)和 O(1) ,为本题的最佳解法。 摩尔投票法:设输入数组 nums 的众数为 x ,数组长度为 n 。 若记 众数 的票数…

面试知识点准备与总结——(并发篇)

目录线程有哪些状态线程池的核心参数sleep和wait的区别lock 与 synchronized 的异同volatile能否保证线程安全悲观锁和乐观锁的区别Hashtable 与 ConcurrentHashMap 的区别ConcurrentHashMap1.7和1.8的区别ThreadLocal的理解ThreadLocalMap中的key为何要设置为弱引用线程有哪些…

【Java】线程的死锁和释放锁

线程死锁是线程同步的时候可能出现的一种问题 文章目录1. 线程的死锁1.1 基本介绍1.2 应用案例2. 释放锁2.1 下面的操作会释放锁2.2 下面的操作不会释放锁1. 线程的死锁 1.1 基本介绍 多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,…

第46章 自定义静态与数据库动态授权依赖注入的定义实现

1 数据库动态授权表授权原理 2 准备工作 2.1 重构Program.cs using Framework.Infrastructure.Extensions; var builder WebApplication.CreateBuilder(args); //如果启动项中不存在“appsettings.json”文件,则通过.Net(Core)的内置方法自动新建“appsettings.…

作为初学者必须要了解的几种常用数据库!

现在已经存在了很多优秀的商业数据库,如甲骨文(Oracle)公司的 Oracle 数据库、IBM 公司的 DB2 数据库、微软公司的 SQL Server 数据库和 Access 数据库。同时,还有很多优秀的开源数据库,如 MySQL 数据库,Po…