你问我互联网工程设计学了啥?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();}}

闭关修炼(十一)网络通信相关推荐

  1. Java闭关修炼64课 很适合新手学习的JAVA视频教程

    Java闭关修炼64课 很适合新手学习的JAVA视频教程 java闭关修炼第一课 什么是java(1).rar   java闭关修炼第一课 什么是java.rar   java闭关修炼第七课 基础语言 ...

  2. 无穷级数求和7个公式_考研数学闭关修炼习题讲解(16)无穷级数 附(6)补充解释

    假期鸽了很久,今天我要分享的是无穷级数,数一的专场. 今天的内容一共有9题,一起加油吧! [1] 本题考查无穷级数的判敛.本题用到的是通过放缩(比较判别法)直接判断敛散性,属于简单题,把后面的sin放 ...

  3. 单个正态总体均值的区间估计_考研数学闭关修炼习题讲解(3536)统计、估计与检验...

    锵锵锵!终于到了收官的时候,是的,没有看错,我们终于刷完了<闭关修炼>!今天的内容是统计.估计与检验,对应闭关修炼第35和36讲,一共有10个题,是又一个大题出题点,大家要小心,首先庆祝一 ...

  4. Windows移动开发(二)——闭关修炼

    一些武侠小说里的大人物,为了争夺武林盟主,号召天下,经常闭关修炼一段时间,闭关期间只能接触送饭的人,并且关外还有很多守卫的人员.还有,无论是篮球还是足球运动员,他们在真正接触球之前,都必须做很长一段时 ...

  5. 十月一“闭关修炼”,读完这些Java技术栈,愿金九银十过五斩六

    十月一由于疫情还是有很多人为了安全不会去旅游,实际上,对于有跳槽打算的人来说,现在正是"闭关修炼"的好时机,但很多人不知道从何开始学习,也正为即将到来的金九银十发愁!今天,小编就要 ...

  6. 来自菜鸟的逆袭,闭关修炼一个月,出关后成功拿下阿里,蚂蚁金服,美团三个大厂意向书!

    前言 楼主来自重庆一个普通的本科大学计算机学院,自己曾经在没拿到offer时也焦虑彷徨过,大大小小的公司自己也有投过,最终在自己闭关修炼一个月后成功斩获4个offer 腾讯 csig 后台开发 自我介 ...

  7. 闭关修炼(二十五)基础web安全

    不是特别难,主要是积累经验 赶紧学springboot去了,好拖延啊.捂脸 文章目录 表单重复提交 前端解决方法 接口如何防止模拟http请求 使用Filter防止XSS攻击 SQL注入 常见的攻击有 ...

  8. 张宇闭关修炼【超清pdf】

    2020张宇闭关修炼[超清]pdf 资料链接 https://shimo.im/docs/rOCr3qKLursLC5Mq/ 祝大家考研顺利! 根据工学.经济学.管理学各学科.专业对硕士研究生入学所应 ...

  9. 闭关修炼21天终于拿到offer

    闭关修炼21天,"啃完"283页pdf,我终于4面拿下字节跳动offer Java程序猿阿谷 写在开篇 闲话(长话短说): 今年的开端有些特殊,疫情的缘故对我们的生活造成了很大的影 ...

  10. 闭关修炼——one——struts2

    今天是为期一个月闭关修炼的第一天---嘻嘻! 今天以及之前所学的Struts2部分知识梳理. day1: 什么是struts2  ---  是一种应用于java ee三层结构中web层的框架,在str ...

最新文章

  1. mysql了解jdbc_JDBC的连接mySql的基本知识
  2. Windows Server 2008 R2 负载平衡入门篇
  3. 电脑知识:新电脑数据迁移解决方案,看完你就会了!
  4. 基于Doxygen的C/C++注释原则
  5. 华为云推出限量NFT云宝,区块链技术为你的数字资产保驾护航
  6. 学习easyui疑问(三)
  7. 一个普通买房者亲历的房价跳涨事件
  8. 对象内存布局 (15)
  9. [QT][待解决问题]对话框ui载入卡顿问题
  10. hfss matlab api 天线,应用HFSS-MATLAB-API设计圆极化微带天线
  11. RGB色彩模式-最广的颜色系统之一
  12. 调用Python的PyAutoGUI模块模拟登录QQ邮箱
  13. android Drawable setbounds()介绍
  14. Android自定义一个属于自己的刻度尺
  15. 卷积神经网络(CNN)超详细介绍
  16. IllegalStateException: Couldn‘t read row 0, col 10 from CursorWindow. Make sure the Cursor is initi
  17. vf省计算机考试题库,四川省33次计算机等级考试vf笔试题(含答案).
  18. 【公开课】如何使用Arm-2D在小资源Cortex-M处理器芯片中实现图形界面?
  19. 美元指数是什么,为什么会对伦敦金有影响
  20. 习惯养成计划申明(重要)

热门文章

  1. linux+shell+解压命令,Shell命令 文件压缩解压缩之gzip、zip详解
  2. php视频转音频文件怎么打开,视频怎么转音频格式 MP4格式怎样转MP3格式
  3. 【散列】杜鹃散列详情与C++实现代码
  4. 迷幻的 JavaScript(js) 装13代码
  5. 简单叙述python的编程规范_简明 Python 编程规范
  6. PTA-然后是几点(基础编程题)
  7. 《C语言点滴》参考文献
  8. Groovy(Java笨狗)系列---断言
  9. OpenStack T版服务组件--Keyston身份服务
  10. 热激发延迟荧光(TADF)材料ND-AC、CND-AC、NAI-BiFA、NAI-PhBiFA