【高级编程】网络编程 基于 TCPUDP 协议的 Socket 编程

文章目录

    • IP地址
    • Socket
      • 基于 TCP 协议的 Socket 编程
      • 基于 UDP 协议的 Socket 编程

IP地址

IP地址(Internet Protocol):唯一标识网络上的每一台计算机

IP地址的组成:32位,由4个8位二进制数组成

11000000.10101000.00000001.11001000 ==> 192.168.1.200

IP地址 = 网络地址 + 主机地址

  • 网络地址:标识计算机或网络设备所在的网段
  • 主机地址:标识特定主机或网络设备
8位 + 24位前8位取值范围
A类网络 主机 主机 主机1~126
B类网络 网络 主机 主机128~191
C类网络 网络 网络 主机192~223
D类用于组播通信224~239
E类用于科研240~255

IP地址的配置和检测

查看IP地址,检测网络是否畅通

  • 查看本机的IP地址:ipconfig

  • 测试网络是否通畅:ping 目标IP地址

DNS域名解析

DNS:Domain Name System,域名系统

网络服务器

通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机

网络服务器 ===> 邮件服务器 Web服务器

  • Microsoft IIS
  • APACHE
  • Apache Tomcat

网络通信协议

为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合

OSI七层网络模型TCP/IP四层概念模型协议
应用层应用层规定了数据的传输格式HTTP FTP TFTP NFS WAIS SMTP
表示层Telnet Rlogin SNMP
会话层SMTP DNS
传输层传输层端口到端口的连接通信TCP UDP
网络层网络层引入一套新的地址来区分不同的广播域ICMP IP ARP RARP AKP UUCP
数据链路层数据链路层定义电信号的分组方式FDDI Ethernet Arpanet PDN SLIP PPP
物理层基于电器特征的高低电压(电信号)高电压代表1 低电压代表0IEEE 802.1A IEEE 802.2到IEEE 802.11

TCP VS UDP

TCPUDP
是否连接面向连接面向非连接
传输可靠性可靠不可靠
速度
在这里插入图片描述在这里插入图片描述

TCP可靠性源于序列号和确认序列号,UDP不能保证数据交付的可靠性

Socket

Socket 是一种网络通信的基础工具,它用于在计算机网络上进行数据传输。简而言之,Socket 提供了应用程序与网络之间的接口,使得应用程序可以通过网络发送和接收数据。

Socket 的底层机制复杂,Java 平台提供了一些简单的 API,可以更简单有效的使用Socket 开发而无需了解底层机制

  • 通信链路的端点就被称为 " 套接字 "(英文名Socket)

  • 是提供给应用程序的接口

Socket 类是 java.net 包的一部分,用于实现基于TCP的网络通信。

java.net包

  • Socket

  • ServerSocket

  • DatagramPacket

  • DatagramSocket

  • InetAddress

基于 TCP 协议的 Socket 编程

基于TCP 协议的 Socket 网络通信:用来实现双向安全连接网络通信

三次握手(建立连接)四次挥手(关闭连接)
A -> B 携带syn数据包A -> B 发送fin包
B -> A 同意连接 发送syn+ackB -> A 发送ack包 进入等待关闭状态
A -> B 再次发送syn数据包B -> A 发送fin包 进入最后确认状态
A -> B 回复ack包 进入超时等待状态 等待结束关闭A B收到ack后立即关闭连接

Socket 通信模型

  • 进行网络通信时,Socket 需要借助数据流来完成数据的传递工作

Socket 网络编程一般可以分成如下步骤进行

0、创建Socket 网络编程模型:客户端/服务器(C/S)

  • 服务器端创建一个 ServerSocket 对象 指定端口号 ServerSocket 负责监听客户端的连接请求。客户端创建一个 Socket 对象 指定服务器的地址和端口号 Socket 负责与服务器建立连接

1、建立连接

  • 服务器端使用 ServerSocketaccept() 方法等待客户端连接。这个方法会阻塞直到一个客户端连接进来

2、打开 Socket 关联的输入输出流

  • 服务器端通过 Socket 对象获取输入输出流(InputStreamOutputStream) 用于接收和发送数据。客户端通过 Socket 对象获取输入输出流 用于与服务器通信

3、数据流中读写信息

  • 使用 InputStreamOutputStream(或者更高层次的 BufferedReaderPrintWriter)进行数据传输 服务器和客户端可以通过这些流进行数据的读取和写入

4、关闭所有的数据流和 Socket

  • 在通信完成后,双方应当关闭流和 socket 连接,以释放资源
// 传递对象信息 序列化
ObjectOutputStream oos = new ObjectOutputStream(...);
oos.writeObject(...);ObjectInputStream ois = new ObjectInputStream(...);
Object = ois.readObject();

举例

使用 java.net 包来创建一个简单的 TCP 客户端-服务器应用程序。

UserServer 代表服务器端,UserClient 代表客户端。

public class UserServer {public static void main(String[] args) {// 假设服务器端口号为 8888System.out.println("---服务器---");try {// 构建服务器ServerSocket serverSocket = new ServerSocket(8888);// 监听客户端发送来的信息 获得socketSocket socket = serverSocket.accept();// 获得字节流InputStream is = socket.getInputStream();// 读取数据StringBuilder sb = new StringBuilder();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {sb.append(new String(buffer, 0, bytesRead, "UTF-8"));}// 输出消息String msg = sb.toString();System.out.println("收到的消息: " + msg);// 释放资源is.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}
public class UserClient {public static void main(String[] args) {System.out.println("---客户端---");try {// 建立 socket 连接 指定服务器 IP + 端口号Socket socket = new Socket("localhost",8888);// 获得字节流OutputStream os = socket.getOutputStream();os.write("hello TCP!!!".getBytes());// 释放资源os.close();socket.close();mm} catch (IOException e) {e.printStackTrace();}}
}

TCP 对象传递

public class Student implements Serializable {private static final long serialVersionUID = 1L;private String name;private String age;public Student(String name, String age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{name='" + name + "', age='" + age + "'}";}
}public class StudentServer {public static void main(String[] args) {System.out.println("---服务器---");ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;ObjectInputStream ois = null;try {// 构建服务器serverSocket = new ServerSocket(8888);// 监听客户端发送来的信息 获得socketsocket = serverSocket.accept();// 获得字节流is = socket.getInputStream();ois = new ObjectInputStream(is);// 读取 Student 对象Student student = (Student) ois.readObject();System.out.println(student.toString());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();} finally {// 关闭资源......}}
}public class StudentClient {public static void main(String[] args) {System.out.println("---客户端---");Socket socket = null;ObjectOutputStream oos = null;try {// 建立 socket 连接 指定服务器 IP + 端口号socket = new Socket("127.0.0.1", 8888);oos = new ObjectOutputStream(socket.getOutputStream());// 创建并发送 Student 对象oos.writeObject(new Student("张三", "18"));System.out.println("发送成功!");} catch (IOException e) {e.printStackTrace();} finally {// 关闭资源if (oos != null) {try {oos.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

多线程处理多请求 实现多客户请求

采用多线程的方式;一个专门负责监听的应用主服务程序;一个专门负责处理请求的线程程序。

public class LoginServer {public static void main(String[] args) {try {System.out.println("\n服务端--------------------");ServerSocket serverSocket = new ServerSocket(8888);Socket socket = null;while (true) {socket = serverSocket.accept();// 创建一个线程来处理登录请求new LoginThread(socket).start();}} catch (Exception e) {e.printStackTrace();}}
}public class LoginThread extends Thread {private Socket socket;public LoginThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();byte[] b = new byte[50];is.read(b);String msg = new String(b);System.out.println(msg);} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (socket != null && !socket.isClosed()) {socket.close();}} catch (IOException ex) {ex.printStackTrace();}}}
}public class LoginClient01 {public static void main(String[] args) {System.out.println("---客户端01---");try {Socket socket = new Socket("127.0.0.1", 8888);OutputStream os = socket.getOutputStream();os.write("用户名:张三,密码:123456".getBytes());os.flush(); // 确保数据已经发送出去socket.close();} catch (IOException e) {e.printStackTrace();}}
}

基于 UDP 协议的 Socket 编程

DatagramSocket:用于发送和接收数据报(UDP数据包)。它提供了用于创建 UDP 套接字并通过其发送和接收数据报的功能。

DatagramPacket:表示要发送或接收的 UDP 数据包。它包含了数据及其目的地地址或来源地址。

基于 UDP 协议的 Socket 网络编程步骤

1、利用 DatagramPacket 对象封装数据包

2、利用 DatagramSocket 发送数据包

3、利用 DatagramSocket 接收数据包

4、利用 DatagramPacket 处理数据包

DatagramSocketsend(DatagramPacket packet) 方法将 DatagramPacket 数据包发送到网络上。DatagramSocketreceive(DatagramPacket packet) 方法从网络中接收数据,并将数据填充到 DatagramPacket 中。

public class UserServer {public static void main(String[] args) {System.out.println("---我是服务端---");DatagramSocket ds = null;DatagramPacket dp = null;Scanner scanner = new Scanner(System.in);try {//接收信息ds = new DatagramSocket(8888);while (true){byte info[] = new byte[1024];//创建数据包 空包dp = new DatagramPacket(info,info.length);//监听ds.receive(dp);//拆包 获得数据String msg = new String(dp.getData(), 0, dp.getLength()).trim();System.out.println("客户端说:"+msg);//发送System.out.print("服务端请输入:");String content = scanner.next();//获得上个数据包的发送地址SocketAddress sa = dp.getSocketAddress();//封装数据包dp = new DatagramPacket(content.getBytes(),content.getBytes().length,sa);ds.send(dp);}} catch (Exception e) {e.printStackTrace();}}
}public class UserClient {public static void main(String[] args) {//发送信息Scanner scanner = new Scanner(System.in);System.out.println("---我是客户端---");DatagramPacket dp = null;DatagramSocket ds = null;try {while(true){System.out.print("客户端请输入:");String msg = scanner.next();//封装数据包 字节数组  字节数组长度  地址对象InetAddress 端口号dp = new DatagramPacket(msg.getBytes() ,msg.getBytes().length,InetAddress.getByName("127.0.0.1"),8888);//创建发送接收对象ds = new DatagramSocket();//发送数据包ds.send(dp);//接收byte info[] = new byte[1024];//创建数据包 空包dp = new DatagramPacket(info,info.length);//监听ds.receive(dp);//拆包 获得数据String content = new String(dp.getData(), 0, dp.getLength()).trim();System.out.println("服务器说:"+ content);}} catch (Exception e) {e.printStackTrace();}finally {ds.close();}}
}

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

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

相关文章

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的,整个处理过程蛮长的,可能配置原因一路上报错也比较多,下面还是逐步记录吧,后面采用连更的方式直到跑通后再…

微服务注册中⼼2

5.Nacos配置管理 Nacos除了可以做注册中⼼,同样可以做配置管理来使⽤ 5.1 统⼀配置管理 当微服务部署的实例越来越多,达到数⼗、数百时,逐个修改微服务配置就会让⼈抓狂,⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案&#xf…

怎样把PPT上顽固的图标删了

例如: 解决: 首先打开下载好的PPT模板,然后在视图选项卡里面找到幻灯片母版。 进入幻灯片母版后,找到第一页母版页就会看到LOGO了,这时使用鼠标就可以选中删除啦。

【论文阅读】PolarNet: 3D Point Clouds for Language-Guided Robotic Manipulation

Abstract 基于自然语言指令的机器人理解和执行操作任务的能力是机器人的长期目标。语言引导操作的主要方法使用 2d 图像表示,这在组合多视图相机并推断精确的 3d 位置和关系方面存在困难。为了解决这些限制,我们提出了一种基于三维点云的policy&#xf…

供方软件供应链安全保障要求及开源场景对照自评表(下)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标,规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式,该国标亦适用于指导开源软件供应链中的供需双方开展组…

专业化的自动化解决方案 VM5XX系列模块在应力应变、仪器仪表和自动化信息化领域的广泛应用

专业化的自动化解决方案 VM5XX系列模块在应力应变、仪器仪表和自动化信息化领域的广泛应用 VM501系列模块是一款专业化的读数模块,采用了单振弦式传感器激励、频率读取和温度转换技术。该模块具有集成度高、体积小、精度高和适应能力强等优点,能够极大地…

力扣面试150 添加与搜索单词 - 数据结构设计 字典树

Problem: 211. 添加与搜索单词 - 数据结构设计 👩‍🏫 参考题解 public class WordDictionary {// 定义一个内部类 Node,用于表示 Trie(前缀树)中的每个节点class Node{// 每个节点有一个大小为 26 的数组&#xff0c…

数据结构--顺序表的创建和增删改查操作

一、编写代码,完成学生管理系统,实现以下操作: 1、输入学生信息 2、任意位置插入学生信息 3、任意位置删除学生信息 4、查找任意位置学生信息 5、修改任意位置学生信息 6、表头插入学生信息 7、表尾插入学生信息 8、表头删除学生信息…

JVM 内存模型:堆、栈、方法区讲解

1. 引言 Java 虚拟机(JVM)的内存模型是 Java 程序运行时的基础之一。JVM 内存模型主要包括 堆、栈、和 方法区。它们各自有不同的作用和管理方式,并且影响着程序的性能和稳定性。为了更好地理解 JVM 的内存管理机制,我们将结合电…

CISP备考题库(八)

CISP即“注册信息安全专业人员”,是面向信息安全企业、信息安全咨询服务机构、信息安全测评机构、政府机构、社会各组织、团体、大专院校以及企事业单位中负责信息系统建设、运行维护和管理工作的信息安全专业人员所颁发的专业资质证书。 更多CISP介绍:e…

快速掌握Postman接口测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正…

简述混沌神经网络

混沌神经网络是一种结合了神经网络与混沌理论的新型智能信息处理系统。以下是对混沌神经网络的详细解析: 一、定义与背景 混沌神经网络是由于神经网络具有高度非线性动力学系统的特性,而混沌又具有无规则性、遍历性、随机性等特点,因此神经网…

豆包MarsCode IDE 搭建 VitePress 博客并使用 GitHub 部署

以下是「 豆包MarsCode 体验官」优秀文章,作者粥里有勺糖。 创建豆包MarsCode 项目 还没有注册登录的可以访问 www.marscode.cn/introductio… 登录并进入IDE界面 在左上角和右上角都有创建项目的入口。 选择 Node.js 项目进行创建。 创建后可以看到项目列表里只是…

monaco editor 在react中的使用

1. 首先先导入monaco editor npm install monaco-editor// npm install monaco-editor --force // 版本冲突? 强行安装 2. 在react中使用 期望效果如下 3. 我遇到的问题 : 输入json数据后 未格式化 , json数据仍然一行展示 我遇到的问题 : 直接输入json数据会白屏报错…

安卓 uniapp跨端开发

HBuilder X 4.24 本地插件方式使用原生插件 例如 MT-TTS 地址PS: 播放 speek({text: ‘test’}) 应为 播放 speak({text: ‘test’})MT-TTS下载下来之后,将 nativeplugins 文件夹拷贝到 uniapp 项目根目录中manifest.json ---- App原生插件配置 运行 语音引擎测试文字转语音播…

基于CNN的10种物体识别项目

一:数据导入和处理 1.导入相关包: import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf2.下载数据 (x_train_all, y_train_all), (x_test, y_test) tf.keras.datasets.cifar10.load_data()# x_valid:测…

基于springboot的智慧社区微信小程序

文未可获取一份本项目的java源码和数据库参考。 本课题研究目标 本文主要对小区生活服务平台的功能和非功能需求进行了分析,系统除了提供物业保修、小区资讯、投诉留言、常用电话等基础功能外,为了满足用户的多样化需求,还提供邻里圈子和有…

sheng的学习笔记-AI-归纳逻辑程序设计(ILP)

AI目录:sheng的学习笔记-AI目录-CSDN博客 规则学习(rule learning): sheng的学习笔记-AI-规则学习(rule learning)-CSDN博客 一阶规则学习: sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)-CSD…

Tiny-universe学习笔记1:Qwen-blog

本文是参与Datawhale Tiny-universe组队学习的第一篇学习笔记,参考链接:https://github.com/datawhalechina/tiny-universe Tiny-universe学习笔记1:Qwen-blog Qwen整体架构与Llama2类似,具体如下图所示: 其中&#…

1 elasticsearch安装

【0】官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/targz.html 【1】Centos7 下载安装 【1.1】下载 官网:Download Elasticsearch | Elastic 选择好自己想要的相关版本即可; 【2】Centos7.X 前置环境配置(uli…