IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程Socket -> 正文阅读

[网络协议]网络编程Socket

概述

常见计算机网络

  • 互联网 : 点与点相连
  • 万维网: 端与端相连
  • 物联网:物与物相连
  • 网络编程: 让计算机与计算机之间建立、进行通信

网络通信协议

通过计算机?络可以使多台计算机实现连接,位于同?个?络中的计算机在进?连接和通信时需要遵守?定的规则,这就好?在道路中?驶的汽??定要遵守交通规则?样。在计算机?络中,这些连接和通信的规则被称为?络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统?规定,通信双?必须同时遵守才能完成数据交换。

网络模型

OSI参考模型

OSI(Open System Interconnect),即开放式系统互联。

  • 是ISO组织在1985年研究的?络互联模型。
  • 该体系结构标准定义了?络互联的七层框架(物理层、数据链路层、?络层、传输层、会话层、表
    示层和应?层)。

在这里插入图片描述

每层功能:

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

TCP/IP模型

  • TCP/IP模型是因特?使?的参考模型,基于TCP/IP的参考模型将协议分成四个层次。
  • 该模型中最重要的两个协议是TCP和IP协议。

在这里插入图片描述

在这里插入图片描述

上图中,TCP/IP协议中的四层分别是应?层、传输层、?络层和链路层,每层分别负责不同的通
信功能。
链路层:链路层是?于定义物理传输通道,通常是对某些?络连接设备的驱动协议,例如针对光
纤、?线提供的驱动。
?络层(?速公路):?络层是整个TCP/IP协议的核?,它主要?于将传输的数据进?分组,将
分组数据发送到?标计算机或者?络。
运输层(卡?):主要使?络程序进?通信,在进??络通信时,可以采?TCP协议,也可以采
?UDP协议。
应?层(货物):主要负责应?程序的协议,例如HTTP协议、FTP协议等。

网络编程

UDP和TCP

UDP: ?户数据报协议(User Datagram Protocol)。UDP是?连接通信协议,即在数据传输时,数据的
发送端和接收端不建?逻辑连接。简单来说,当?台计算机向另外?台计算机发送数据时,发送端不会
确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

在这里插入图片描述
由于使?UDP协议消耗资源?,通信效率?,所以通常都会?于?频、视频和普通数据的传输例如视频
会议都使?UDP协议,因为这种情况即使偶尔丢失?两个数据包,也不会对接收结果产?太?影响。

TCP: 传输控制协议 (Transmission Control Protocol)。TCP协议是?向连接的通信协议,即传输数据
之前,在发送端和接收端建?逻辑连接,然后再传输数据,它提供了两台计算机之间可靠?差错的数据
传输。

在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要
经过“三次握?”。

三次握?:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可
靠。

  • 第?次握?,客户端向服务器端发出连接请求,等待服务器确认
  • 第?次握?,服务器端向客户端回送?个响应,通知客户端收到了连接请求。
  • 第三次握?,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。

在这里插入图片描述

TCP/UDP区别:

TCP(传输控制协议,Transmission Control Protocol):(类似打电话)?向连接、传输可靠(保证数
据正确性)、有序(保证数据顺序)、传输?量数据(流模式)、速度慢、对系统资源的要求多,程序
结构较复杂,每?条TCP连接只能是点到点的,TCP?部开销20字节。

UDP(?户数据报协议,User Data Protocol):(类似发短信)?向?连接 、传输不可靠(可能丢
包)、?序、传输少量数据(数据报模式)、速度快,对系统资源的要求少,程序结构较简单 ,UDP?
持?对?,?对多,多对?和多对多的交互通信,UDP的?部开销?,只有8个字节。

网络编程三要素

协议

  • 计算机?络通信必须遵守的规则,已经介绍过了,不再赘述。

IP地址

  • IP地址:指互联?协议地址(Internet Protocol Address),俗称IP。IP地址?来给?个?络中的
    计算机设备做唯?的编号。假如我们把“个?电脑”?作“?台电话”的话,那么“IP地址”就相当
    于“电话号码”。

  • IP地址分类

    • 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地址: 127.0.0.1 、 localhost

端口号

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

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

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

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

TCP编程

概述
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端
(Server)

两端通信步骤
1、服务端程序,需要事先启动,等待客户端的连接
2、 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

TCP通信程序
1、客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应
请求,两者建?连接开始通信。
2、服务端:java.net.ServerSocket类表示。创建 ServerSocket 对象,相当于开启?个服
务,并等待客户端的连接。

在这里插入图片描述
开发步骤:

  • 建?通信连接(会话):
    • 创建ServerSocket,指定端?号。
    • 调?accept等待客户端接?。
  • 客户端请求服务器:
    • 创建Socket,指定服务器IP + 端?号。
    • 使?输出流,发送请求数据给服务器
  • 使?输?流,接收响应数据到客户端(等待)
    • 服务器响应客户端。
    • 使?输?流,接收请求数据到服务器(等待)
    • 使?输出流,发送响应数据给客户端。

客户端向服务器发送数据

服务端实现:

public class ServerTCP {
        public static void main(String[] args) throws IOException {
            System.out.println("服务端启动 , 等待连接 .... ");
            // 1.创建 ServerSocket对象,绑定端?,开始等待连接
            ServerSocket ss = new ServerSocket(6666);
            // 2.接收连接 accept ?法, 返回 socket 对象.
            Socket server = ss.accept();
            // 3.通过socket 获取输?流
            InputStream is = server.getInputStream();
             // 4.?次性读取数据
             // 4.1 创建字节数组
            byte[] b = new byte[1024];
             // 4.2 据读取到字节数组中.
            int len = is.read(b);
           // 4.3 解析数组,打印字符串信息
            String msg = new String(b, 0, len);
            System.out.println(msg);
           //5.关闭资源.
            is.close();
            server.close();
        }
    }

客户端实现:

 public class ClientTCP {
        public static void main(String[] args) throws Exception {
            System.out.println("客户端 发送数据");
            // 1.创建 Socket ( ip , port ) , 确定连接到哪?.
            Socket client = new Socket("localhost", 6666);
            // 2.获取流对象 . 输出流
            OutputStream os = client.getOutputStream();
            // 3.写出数据.
            os.write("你好么? tcp ,我来了".getBytes());
            // 4. 关闭资源 .
            os.close();
            client.close();
        }
    }

服务器向客户端回写数据

服务端实现:

public class ServerTCP {
        public static void main(String[] args) throws IOException {
            System.out.println("服务端启动 , 等待连接 .... ");
            // 1.创建 ServerSocket对象,绑定端?,开始等待连接
            ServerSocket ss = new ServerSocket(6666);
            // 2.接收连接 accept ?法, 返回 socket 对象.
            Socket server = ss.accept();
            // 3.通过socket 获取输?流
            InputStream is = server.getInputStream();
            // 4.?次性读取数据
            // 4.1 创建字节数组
            byte[] b = new byte[1024];
            // 4.2 据读取到字节数组中.
            int len = is.read(b)// 4.3 解析数组,打印字符串信息
            String msg = new String(b, 0, len);
            System.out.println(msg);
            // =================回写数据=======================
            // 5. 通过 socket 获取输出流
            OutputStream out = server.getOutputStream();
            // 6. 回写数据
            out.write("我很好,谢谢你".getBytes());
            // 7.关闭资源.
            out.close();
            is.close();
            server.close();
        }
    }

客户端实现:

 public class ClientTCP {
        public static void main(String[] args) throws Exception {
            System.out.println("客户端 发送数据");
            // 1.创建 Socket ( ip , port ) , 确定连接到哪?.
            Socket client = new Socket("localhost", 6666);
            // 2.通过Scoket,获取输出流对象
            OutputStream os = client.getOutputStream();
            // 3.写出数据.
            os.write("你好么? tcp ,我来了".getBytes());
            // ==============解析回写=========================
            // 4. 通过Scoket,获取 输?流对象
            InputStream in = client.getInputStream();
            // 5. 读取数据数据
            byte[] b = new byte[100];
            int len = in.read(b);
            System.out.println(new String(b, 0, len));
            // 6. 关闭资源 .
            in.close();
            os.close();
            client.close();
        }
    }

UDP编程

主要?到两个类DatagramPacket和DatagramSocket,下?分别介绍。

DatagramSocket:

此类表示?来发送和接收数据报包的套接字。

构造?法:

  • DatagramSocket(int port) ~创建数据报套接字并将其绑定到本地主机上的指定端?
  • DatagramSocket(int port, InetAddress laddr) ~创建数据报套接字,将其绑定到指定的本地地址。

DatagramPacket
此类表示数据报包。
两个都要先构造好相应的数据包(java.net.DatagramPacket)。
在DatagramPacket包中的函数 int getLength()返回实际接受的字节数。

客户端1

 public class Client1 {
        public static void main(String[] args) throws IOException {
            System.out.println("客户端1启动。。。。");
            /**
             * 接收信息
             */
             //1,创建?个指定端?的DatagramSocket
            DatagramSocket socket = new DatagramSocket(8888);
            //2,创建?个字节数组
            byte[] data = new byte[1024];
            //3,创建DatagramPacket接收客户端的信息
            DatagramPacket packet = new DatagramPacket(data,data.length);
            //4,接收消息
            socket.receive(packet);
            //读取数据
            String msg = new String(data, 0, packet.getLength());
            System.out.println("客户端2:"+msg);
            /**
             * 发送消息
             */
            //5,指定地址,端?
            byte[] data2 = "你好,我是客户端1".getBytes();
            InetAddress localhost = InetAddress.getByName("localhost");
            int port = 9999;
            //6,创建消息
            DatagramPacket packet2 = new
                    DatagramPacket(data2,data2.length,localhost,port);
             //7,发送消息
            socket.send(packet2);
            socket.close();
        }
    }

客户端2

  public class Client2 {
        public static void main(String[] args) throws IOException {
            System.out.println("客户端2启动。。。。。");
            /**
             * 发送消息
             */
            //1,创建DatagramSocket,指定端?
            DatagramSocket socket = new DatagramSocket(9999);
            //2,指定地址端?
            InetAddress localhost = InetAddress.getByName("localhost");
            int port = 8888;
            //3,要发送的消息
            byte[] data = "你好,客户端1".getBytes();
            //4,创建
            DatagramPacket packet = new
                    DatagramPacket(data,data.length,localhost,port);
            //5,发送
            socket.send(packet);
            /**
             * 接收消息
             */
            //1,创建?个数组
            byte[] data2 = new byte[1024];
            DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
            socket.receive(packet2);
            //2,解析发送过来的消息
            String msg = new String(data2, 0, packet2.getLength());
            System.out.println("客户端1:"+msg);
            socket.close();
        }
    }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 13:08:02  更:2022-10-17 13:09:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:46:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码