网络编程-TCP

news/2024/5/18 19:35:21/文章来源:https://blog.csdn.net/XiaoBoYes/article/details/126934245

软件结构分类

C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件
B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等


网络编程三要素

  • IP地址
  • 端口号
  • 协议

IP地址

  • 设备在网络中的地址, 是唯一的标识
  • 全称”互联网协议地址”,也称IP地址。是分配给上网设备的数字标签。常见的IP分类为:ipv4和ipv6
    简单来说 : 就是设备在网络中的唯一标识 , 想要连接哪一台电脑 , 就找到此电脑在网络中的ip地址

ipv4是由4个字节组成, 通常使用点分十进制表示法
在这里插入图片描述
ipv6是由16个字节组成, 每两个字节为一组, 通常使用冒分十六进制表示法
在这里插入图片描述
ipv6表示的特殊情况
在这里插入图片描述


命令行窗口中的IP操作

  • 常用命令:
    • ipconfig:查看本机IP地址
    • ping IP地址:检查网络是否连通
  • 特殊IP地址:
    • 127.0.0.1:是回送地址也称本地回环地址,可以代表本机的IP地址,一般用来测试使用

Java中的IP操作

为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用
InetAddress:此类表示Internet协议(IP)地址

static InetAddress getByName​(String host) 在给定主机名的情况下获取InetAddress类的对象
String getHostName​() 获取此 IP 地址的主机名
String getHostAddress​() 返回 IP 地址字符串(以文本表现形式)

端口

  • 应用程序在设备中的唯一标识
  • 端口号:应用程序的唯一标识方式 , 用两个字节表示的整数值,它的取值范围是0~65535。
    其中0~1023之间的端口号用于一些知名的网络服务或者应用。
    我们自己使用1024以上的端口号就可以了。

协议

  • 数据在网络中传输的规则, 常见的协议有UDP协议和TCP协议
  • UDP协议
    • 用户数据报协议(User Datagram Protocol)
    • UDP是面向无连接通信协议
    • 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
  • TCP协议
    • 传输控制协议 (Transmission Control Protocol)
    • TCP协议是面向连接的通信协议
    • 速度慢,没有大小限制,数据安全

TCP通信原理

  • TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
  • 通信之前要保证连接已经建立
  • 通过Socket产生IO流来进行网络通信

TCP发送数据的步骤(客户端)

public class ClientDemo {public static void main(String[] args) throws IOException {// 1 创建客户端的Socket对象 Socket(String host, int port) 与指定服务端连接Socket socket = new Socket("127.0.0.1", 10086);// 2 通过Socket对象获取网络中的输出流 写数据OutputStream os = socket.getOutputStream();os.write("hello world".getBytes());os.flush();// 没有手动写结束标记// 3 释放资源os.close(); // 关闭输出流会自动添加结束标记socket.close();}
}

TCP接收数据的步骤(服务端)

public class ServerDemo {public static void main(String[] args) throws IOException {// 1 创建服务端的Socket对象 : ServerSocket类ServerSocket serverSocket = new ServerSocket(10086);// 2 监听客户端连接, 并接受连接, 返回一个Socket对象System.out.println("阻塞之前...");Socket socket = serverSocket.accept(); // accept函数会阻塞, 除非接受到客户端连接System.out.println("阻塞之后...");// 3 获取网络中的输入流, 用来读取客户端发来的数据InputStream is = socket.getInputStream();byte[] bys = new byte[1024];int len;while((len = is.read(bys)) != -1) { // read函数会阻塞, 除非读到结束标记System.out.print(new String(bys, 0, len));}// 4 释放资源 : 服务端一般不会关闭is.close();socket.close();serverSocket.close();}
}

在这里插入图片描述


TCP的三次握手(建立连接)

在这里插入图片描述

TCP案例一 客户端向服务端发送图片

  • 客户端:
public class ClientDemo {public static void main(String[] args) throws IOException {// 1 创建Socket对象Socket socket = new Socket("127.0.0.1", 10000);// 把本地文件中的图片读到内存中// 创建高效的字节输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\p1.jpg"));// 把网络中字节输出流封装成高效的字节输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());// 从本地中读一个字节 再把字节发送到服务端byte[] bys = new byte[1024];int len;while((len = bis.read(bys)) != -1) { // 读到结束标记后停止, 但不写入结束标记bos.write(bys, 0, len);bos.flush();}socket.shutdownOutput(); // 写入结束标记// =====================等待服务端的反馈============================// 把网络中的字节输入流封装成高效的字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s = br.readLine();System.out.println(s);br.close();bos.close();bis.close();socket.close();}
}
  • 服务端
public class ServerDemo {public static void main(String[] args) throws IOException {// 1 创建ServerSocket对象ServerSocket serverSocket = new ServerSocket(10000);// 2 监听客户端的连接Socket socket = serverSocket.accept();// 3 把网络中的字节输入流封装成高效的字节输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());// 4 创建本地的高效字节输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day12\\p1.jpg"));// 5 使用网络字节输入流接收一个字节 再通过本地的字节输出流把字节写到本地文件中去byte[] bys = new byte[1024];int len;while((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);bos.flush();}// =====================给客户端反馈==========================BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("感谢, 很好看");bw.newLine();bw.flush();// 释放资源bw.close();bos.close();bis.close();socket.close();serverSocket.close();}
}

TCP案例二 客户端从服务端下载图片

  • 客户端:
public class ClientDemo {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 10010);// 高效的网络字节输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());// 高效的本地字节输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day12\\src\\com\\xiaobo\\homework04\\p1.jpg"));byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);bos.flush();}//=====================给予服务端反馈=====================BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("下载成功!");bw.newLine();bw.flush();//=====================关闭资源=====================bw.close();bos.close();bis.close();socket.close();}
}
  • 服务端:
public class ServerDemo {// 定义有3个线程的线程池private static ExecutorService threadPool = Executors.newFixedThreadPool(3);public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(10010);while (true) {Socket socket = serverSocket.accept(); // 接收客户端连接threadPool.submit(new ServerThread(socket));}}
}
public class ServerThread implements Runnable {private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {// 高效的网络字节输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());// 高效的本地字节输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:test1\\p2.jpg"));byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);bos.flush();}socket.shutdownOutput(); // 结束标记// 高效的网络字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s = br.readLine();System.out.println(s);//=====================无资源的关闭=====================} catch (Exception e) {e.printStackTrace();}}
}

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

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

相关文章

Unity Editor 扩展入门1

教程来源:https://www.youtube.com/watch?v=491TSNwXTIg&t=204s 一个点击物体修改材质颜色的简单editor扩展工具 using UnityEngine; using UnityEditor;public class ExampleWindow : EditorWindow {[MenuItem("Window/Colorizer")]public static void ShowWi…

入行数字IC验证后会做些什么?需要哪些必备技能?

想必大家眼中的验证工程师就是整天对着电脑敲代码,这是大家对这个岗位的固定印象。其实真实情况并不是这样,那么入行数字IC验证后会做些什么?需要哪些必备技能?下面就一起来了解一下吧。 什么是IC验证工程师? 回答这…

15天深度复习JavaWeb的详细笔记(四)——HTML、CSS

Demo04-HTML、CSS 1,HTML 1.1 介绍 HTML 是一门语言,所有的网页都是用HTML 这门语言编写出来的,也就是HTML是用来写网页的,像京东,12306等网站有很多网页。HTML(HyperText Markup Language):超文本标记语…

阿里云 window下 nginx 安装https证书的配置。

首先我这里使用的是阿里云免费的https证书。 免费证书可以申请20个,每个的有效期为1年。 我这里使用的是nginx部署,所以下载nginx的 证书压缩包 下载下来之后解压,有两个文件一个是, 一个是xxx.pem ,另一个是xxxx.key. nginx 配…

企业文件加密系统价格—公司文件加密系统多少钱?

企业文件加密系统多少钱?怎么收费?一般是根据需要购买的台数进行收费的。 现在市面上有很多做文件加密系统的厂商,每家收费标准都不一样,在百度搜索文件加密系统的价格,就会发现价格有几百到1000/台的不等。企业文件加…

详细讲解FuzzBench如何添加新的Fuzzer

最近几天一直在弄FuzzBench添加新的fuzzer,在添加过程中遇到各种问题,在此做详细记录。 拉取fuzzbench到本地 这一部分可以直接参考此链接FuzzBench预备条件 1.拉取代码到本地 git clone https://github.com/google/fuzzbench cd fuzzbench git submo…

我上线了一个炫酷的项目实战教程网站,主流技术一网打尽~

之前经常遇到小伙伴问我,之前写的某篇技术文章在哪里。又或者是拿着很早以前的部署文档问我,按这个文章怎么部署不起来。其实他们如果上过我的实战教程网站的话,估计就不会有这些问题了,我的原创文章基本都会同步上去。今天和大家…

孙宇晨:区块链行业势必迎来光明的未来

近日,波场TRON创始人孙宇晨受邀在米尔肯研究院(Milken Institute)官方网站上发表了题为《区块链行业势必迎来光明的未来》的署名文章。孙宇晨在文章中表示,作为一种新兴的颠覆性技术,加密行业的发展之路并非一帆风顺。…

Fat Tree 分析

本文是源于USTC Advance Computer Network 的课程内容做的总结 论文来源:A scalable, commodity data center network architecture 本文将分析Fat Tree的 拓扑结构、编址方案和路由算法三个方面。 拓扑结构 该文章中从传统数据中心通信的问题提出了FatTree的拓扑…

机器学习——聚类(K-Means)

机器学习——聚类(K-Means)那是什么 无监督学习——聚类聚类是基于相似对象将一组对象分组为类/类别的过程。聚类是一部分 无监督学习 .这种方法通常用于确定业务决策,特别是在基于来自集群的数据预测来预测正确的业务策略时。聚类还可用于异常检测、客户细分和改善客户服务…

食品行业中的 AI 和 ML 用例

食品行业中的 AI 和 ML 用例人工智能和机器学习为每个行业的进步铺平了道路。这些技术的使用帮助他们优化和自动化流程,降低成本和时间要求,减少人为错误的可能性。让我们了解采用基于 AI 和 ML 的技术如何使食品行业受益。Photo by 阿诺塞诺纳 on 不飞溅 由农民和各种企业…

持续集成持续交付

目录 一、Git工具 二、git安装 三、git使用 三、gitlab代码仓库 四、jenkins持续集成 五、Jenkins自动构建docker镜像,并上传至harbor仓库 六、Jenkins连接docker构建主机 七、jenkins结合ansible 一、Git工具 git简介 1).Git特点: • 速度 • 简…

PHP在线教育平台源码 网课小程序源码

在线教育知识付费平台 网课小程序源码 教育直播网校小程序源码 开发环境:PHP MYSQL 源码包含:PC小程序公众号 H5 需要绑定对接公众号 本套源码程序适合做视频图文结合的知识付费平台。带分销功能,多种分销方式自由设置(可快速积…

通关GO语言22 网络编程:Go 语言如何通过 RPC 实现跨平台服务?

在上一讲中,我为你讲解了 RESTful API 的规范以及实现,并且留了两个作业,它们分别是删除和修改用户,现在我为你讲解这两个作业。 删除一个用户比较简单,它的 API 格式和获取一个用户一样,但是 HTTP 方法换…

二、JumpServer堡垒机管理员手册

JumpServer是一款非常简单好用的开源堡垒机,本文根据实际生产案例编辑的管理员手册,列出了JumpServer常用功能。JumpServer可以很好的保护公司内部服务器,并满足等保2.0安全需求。 目录 一、堡垒机用户创建 二、创建特权用户 三、创建普通…

金字塔思维

背景 1、大脑偏爱有规律的信息 2、把问题想全,同时可以深入 1 方法: 1.1 识别纵向信息逻辑: 被动接受了大量杂乱信息,通过金字塔思维识别信息的逻辑关系 1.2 横向分类:信息归类整理 穷尽所有要素、对要素进行分类…

docker、docker-compose部署oracle,plsql连接远程oracle

一、docker部署oracle 1. 下载镜像并启动容器 # 拉取阿里oracle_11g的镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g # 创建容器并启动 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 2.…

我们该如何运营Facebook账号呢?

社交媒体带来的流量转化是巨大的,这也就是为什么跨境电商卖家会转战到社媒的原因了。我们经常会发现一个帖子突然就火了,那么这个帖子的相关产品都得到了极大的推广,其曝光率也是难以想象的,那么由此带来的转化也常常令人欣喜若狂…

间主任的烦恼① | 基于BOM的配套检查,保障生产不断线

王部长:(桌上电话铃声响起,王部长接完电话后说,)“小智,我们装配车间的张主任,这打电话来,又在说配套缺件问题。这周就要启动装配了,现在领料发现还有20种零件没有库存。…

CentOS系统磁盘的分区格式化和挂载操作

一、磁盘分区和格式化 lsblk命令查看挂载硬盘的情况,一下情况表示为分卷,需要先分卷,再格式化,然后再进行挂载。 分卷命令:fdisk /dev/vdb 输入n 输入p和1,直接回车 最后输入w保存。 格式化磁盘&#x…