闭关修炼(十一)网络通信
你问我互联网工程设计学了啥?emm。。。感觉上课都在照着抄代码,要说什么印象特别深,脑海里还真没剩啥了。
文章目录
- 网络通讯
- IP
- 端口号
- 客户端和服务端
- TCP与UDP
- 什么是网络模型
- TCP和UDP的区别
- 什么是三次握手
- 什么是四次挥手
- 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
- UDP的客户端与服务端通讯例子
- TCP的客户端和服务端
网络通讯
IP
定位某台计算机
端口号
定位某个应用程序
客户端和服务端
发起请求端为客户端,发送响应端为服务端
TCP与UDP
什么是网络模型
4层,应用层(HTTP协议),传输层(TCP,UDP协议),网络层(IP协议),链路层(以太网协议)
任何计算机语言通讯,底层都使用socket技术
为什么socket支持这么多语言?
socket遵循一个二进制的端口号+IP的规范进行传输,所以可以跨语言使用。
socket核心协议:TCP和UDP
TCP和UDP的区别
UDP面向无连接 — 即不建立连接、限制传输64k的不可靠协议
TCP面向连接协议,三次握手后进行通讯,通过字节流进行传输,效率比UDP低,但比UDP靠谱。
什么是三次握手
当三次握手成功之后,才开始进行数据传输。
第一次握手:客户端:发送报文给服务端,SYN=J
第二次握手:服务端:发送报文给客户端,ACK=J+1,SYN=K
第三次握手:客户端:发送报文给服务端,ACK=K+1
什么是四次挥手
结束通信会进行四次挥手。
第一次挥手:客户端:发送FIN=M
第二次挥手:服务端:发送SYN=M+1
第三次挥手:服务端:发送FIN=N
第四次挥手:客户端:发送ACK=N+1
为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了,但是你还可以给对方发送数据,也有这么种可能,你还有一些数据在传给对方的途中,所以你不能立马关闭连接,也即你可能还需要把在传输途中的数据给对方之后,又或者,你还有一些数据需要传输给对方后,(再关闭连接)再发送FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。
UDP的客户端与服务端通讯例子
UDP核心是DatagramSocket和DatagramPacket。
服务端,用DatagramSocket+传入端口创建服务器,并且建立DatagramPacket来接收客户端的数据包
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** udp服务器** @author uuz* @date 2021/01/11*/
public class UdpServer {/*** 端口号*/static int PORT = 9009;/*** 缓冲区大小*/static int BUFFER_SIZE = 1024;/*** 正在运行*/static boolean IS_RUNNING = true;public static void main(String[] args) throws IOException {System.out.println("UDP SERVER IS RUNNING...");// 创建服务器端口号,默认使用本机ipDatagramSocket datagramSocket = new DatagramSocket(PORT);while (IS_RUNNING) {// 定义数据包byte[] buf = new byte[BUFFER_SIZE];DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);// 接收客户端发来的数据,将数据封装给数据包,此方法阻塞接收datagramSocket.receive(datagramPacket);// 打印来源地址System.out.printf("来源IP地址: %s:%s\n内容: %s\n",datagramPacket.getAddress(),datagramPacket.getPort(),new String(datagramPacket.getData(), 0, datagramPacket.getLength()));}}}
客户端,构造DatagramPacket,传入服务器IP和端口,使用datagramSocket发送
import java.io.IOException;
import java.net.*;public class UdpClient {static String REMOTE_ADDRESS = "127.0.0.1";public static void main(String[] args) throws IOException {System.out.println("新建Socket客户端");// 创建一个socket客户端DatagramSocket datagramSocket = new DatagramSocket();// 要发送的内容String content = "这是一条测试信息";// 转换成byte[]byte[] bytes = content.getBytes();// 创建数据包,带上要的发送IP和端口DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(REMOTE_ADDRESS),UdpServer.PORT);datagramSocket.send(dp);datagramSocket.close();System.out.println("发送UDP结束");}
}
TCP的客户端和服务端
服务器端
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** tcp服务器** @author uuz* @date 2021/01/11*/
public class TCPServer {static int PORT = 8889;static int BUFFER_SIZE = 1024;static boolean isRunning = true;public static void main(String[] args) throws IOException {System.out.println("TCP SERVER START");// 创建服务器端口号ServerSocket serverSocket = new ServerSocket(PORT);while (isRunning) {// 阻塞接收信息Socket socket = serverSocket.accept();// 获取socket传输的字节流InputStream inputStream = socket.getInputStream();// 将字节流转为Stringbyte[] bytes = new byte[BUFFER_SIZE];int length = inputStream.read(bytes);// 转换成StringString data = new String(bytes, 0, length);// 打印输出System.out.println(data);}serverSocket.close();}
}
客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class TCPClient {static String REMOTE_ADDRESS = "127.0.0.1";public static void main(String[] args) throws IOException {System.out.println("tcp 客户端");// 连接服务器Socket socket = new Socket(REMOTE_ADDRESS, TCPServer.PORT);// 获取字节流OutputStream outputStream = socket.getOutputStream();// 发送outputStream.write("这是一条测试".getBytes());// 关闭连接socket.close();}
}
服务端多线程版
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.SneakyThrows;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** tcp服务器** @author uuz* @date 2021/01/11*/
public class TCPServer {static int PORT = 8889;static int BUFFER_SIZE = 1024;static int THREAD_POOL_SIZE = 10;static boolean isRunning = true;public static void main(String[] args) throws IOException {System.out.println("TCP SERVER START");// 创建服务器端口号ServerSocket serverSocket = new ServerSocket(PORT);// 创建线程池ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);while (isRunning) {// 阻塞接收信息Socket socket = serverSocket.accept();executorService.execute(new Runnable() {@SneakyThrows@Overridepublic void run() {// 获取socket传输的字节流InputStream inputStream = socket.getInputStream();// 将字节流转为Stringbyte[] bytes = new byte[BUFFER_SIZE];int length = inputStream.read(bytes);// 转换成StringString data = new String(bytes, 0, length);// 打印输出System.out.println(data);}});}serverSocket.close();}}
闭关修炼(十一)网络通信相关推荐
- Java闭关修炼64课 很适合新手学习的JAVA视频教程
Java闭关修炼64课 很适合新手学习的JAVA视频教程 java闭关修炼第一课 什么是java(1).rar java闭关修炼第一课 什么是java.rar java闭关修炼第七课 基础语言 ...
- 无穷级数求和7个公式_考研数学闭关修炼习题讲解(16)无穷级数 附(6)补充解释
假期鸽了很久,今天我要分享的是无穷级数,数一的专场. 今天的内容一共有9题,一起加油吧! [1] 本题考查无穷级数的判敛.本题用到的是通过放缩(比较判别法)直接判断敛散性,属于简单题,把后面的sin放 ...
- 单个正态总体均值的区间估计_考研数学闭关修炼习题讲解(3536)统计、估计与检验...
锵锵锵!终于到了收官的时候,是的,没有看错,我们终于刷完了<闭关修炼>!今天的内容是统计.估计与检验,对应闭关修炼第35和36讲,一共有10个题,是又一个大题出题点,大家要小心,首先庆祝一 ...
- Windows移动开发(二)——闭关修炼
一些武侠小说里的大人物,为了争夺武林盟主,号召天下,经常闭关修炼一段时间,闭关期间只能接触送饭的人,并且关外还有很多守卫的人员.还有,无论是篮球还是足球运动员,他们在真正接触球之前,都必须做很长一段时 ...
- 十月一“闭关修炼”,读完这些Java技术栈,愿金九银十过五斩六
十月一由于疫情还是有很多人为了安全不会去旅游,实际上,对于有跳槽打算的人来说,现在正是"闭关修炼"的好时机,但很多人不知道从何开始学习,也正为即将到来的金九银十发愁!今天,小编就要 ...
- 来自菜鸟的逆袭,闭关修炼一个月,出关后成功拿下阿里,蚂蚁金服,美团三个大厂意向书!
前言 楼主来自重庆一个普通的本科大学计算机学院,自己曾经在没拿到offer时也焦虑彷徨过,大大小小的公司自己也有投过,最终在自己闭关修炼一个月后成功斩获4个offer 腾讯 csig 后台开发 自我介 ...
- 闭关修炼(二十五)基础web安全
不是特别难,主要是积累经验 赶紧学springboot去了,好拖延啊.捂脸 文章目录 表单重复提交 前端解决方法 接口如何防止模拟http请求 使用Filter防止XSS攻击 SQL注入 常见的攻击有 ...
- 张宇闭关修炼【超清pdf】
2020张宇闭关修炼[超清]pdf 资料链接 https://shimo.im/docs/rOCr3qKLursLC5Mq/ 祝大家考研顺利! 根据工学.经济学.管理学各学科.专业对硕士研究生入学所应 ...
- 闭关修炼21天终于拿到offer
闭关修炼21天,"啃完"283页pdf,我终于4面拿下字节跳动offer Java程序猿阿谷 写在开篇 闲话(长话短说): 今年的开端有些特殊,疫情的缘故对我们的生活造成了很大的影 ...
- 闭关修炼——one——struts2
今天是为期一个月闭关修炼的第一天---嘻嘻! 今天以及之前所学的Struts2部分知识梳理. day1: 什么是struts2 --- 是一种应用于java ee三层结构中web层的框架,在str ...
最新文章
- mysql了解jdbc_JDBC的连接mySql的基本知识
- Windows Server 2008 R2 负载平衡入门篇
- 电脑知识:新电脑数据迁移解决方案,看完你就会了!
- 基于Doxygen的C/C++注释原则
- 华为云推出限量NFT云宝,区块链技术为你的数字资产保驾护航
- 学习easyui疑问(三)
- 一个普通买房者亲历的房价跳涨事件
- 对象内存布局 (15)
- [QT][待解决问题]对话框ui载入卡顿问题
- hfss matlab api 天线,应用HFSS-MATLAB-API设计圆极化微带天线
- RGB色彩模式-最广的颜色系统之一
- 调用Python的PyAutoGUI模块模拟登录QQ邮箱
- android Drawable setbounds()介绍
- Android自定义一个属于自己的刻度尺
- 卷积神经网络(CNN)超详细介绍
- IllegalStateException: Couldn‘t read row 0, col 10 from CursorWindow. Make sure the Cursor is initi
- vf省计算机考试题库,四川省33次计算机等级考试vf笔试题(含答案).
- 【公开课】如何使用Arm-2D在小资源Cortex-M处理器芯片中实现图形界面?
- 美元指数是什么,为什么会对伦敦金有影响
- 习惯养成计划申明(重要)
热门文章
- linux+shell+解压命令,Shell命令 文件压缩解压缩之gzip、zip详解
- php视频转音频文件怎么打开,视频怎么转音频格式 MP4格式怎样转MP3格式
- 【散列】杜鹃散列详情与C++实现代码
- 迷幻的 JavaScript(js) 装13代码
- 简单叙述python的编程规范_简明 Python 编程规范
- PTA-然后是几点(基础编程题)
- 《C语言点滴》参考文献
- Groovy(Java笨狗)系列---断言
- OpenStack T版服务组件--Keyston身份服务
- 热激发延迟荧光(TADF)材料ND-AC、CND-AC、NAI-BiFA、NAI-PhBiFA