一、笔记

网络安全
网络:
即是计算机网络: 是不同地区,通过网络来传递数据,来进行数据的交互
网络编程的三大要素:

1. ip 2.端口号 3.协议

套接字的定义:

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。

ip:ip 是每一台电脑的唯一标识
两种分类:

 ip4:是由0-255组成,是四个字节   一般网络都192.168==>c类网络   a类一般政府(军事用途),一般子网络是: 10.08      本地的特殊的ip 是 127.0.0.1(this)
查看当前电脑的ip地址 ipconfig     拼服务器是否连通了,也就是拼ip地址(重点)ip6 :是由8个数组数组,四个16精制组成

java 提供获取ip的类 InetAddress

public static InetAddress getLocalHost()  返回本地主机
public String getHostAddress() 获取ip地址
public String getHostName()   获取ip的主机名:public String getHostName()

端口号:每一个软件(每一个进程的唯一标识)

端口号:

当软件开启之后,系统给其生成的一个,也可以自己去设置,
当软件开启是端口号系统产生,当软件关闭的时候,回收

用软件的端口号:

  • Tomcat: 8080
  • oracle:1521
  • mysql:3306
  • qq:4000
  • 邮箱的端口号: 网易 137

协议: 各个计算机网络传输的一个规范
协议分为7层
传输层 : TCP UDP + xmpp 协议 ==> 即时通讯(qq,微信)

TCP 与 UDP的区别:

UDP面向无连接的协议: 传输的数据快,但是可以会丢数据(cts飞q) 会出现卡顿
TCP 面向连接的协议: 传输慢,不会丢失数据(三次握手) ==>qq传消息 文字需要准确性,使用的就是这个协议

web阶段主要: http 协议 https 协议

http 与https==>都是属于一次性的连接==>也就是客户端给服务器发送请求,当交互完,这个请求就断开了
https =http+ssl 证书,这个证书保证数据的传输的安全性  大部分上线的网站都会使用https协议

面向协议来进行通信 :TCP 做一个对象
Socket 对象: 接字是两台机器间通信的端点。
Socket构造方法

public Socket(String host,int port)   如果是本机ip地址传递localhost
传递两个参数   一个ip地址, 一个是端口号 (女孩子的微信号)

常规的方法

public OutputStream getOutputStream()throws IOException  写数据的流对象
public InputStream getInputStream()throws IOException  读取数据的对象
public void shutdownOutput()throws IOException 类似于flush()方法

客户端(女孩子)==> 发送消息的过程

1.实例化这个socket对象
2.通过socket对象 得到输出流 OutputStream
3.调用  write()
4.shutdownOutput()
5.拿到输入流 InputStream
6.new BufferReader(new InputStreamReader(new FileInputStream))
7.关闭资源

ServerSocket 此类实现服务器套接字
构造 :

public ServerSocket(int port) 需要与客户端的端口号一样

常用的方法:

public Socket accept()throws IOException  监听客户端发送的消息,返回一个Socket

服务器(男子)

1.实例化ServerSocke
2. 调用  accept() 返回的是一个socket对象
3.拿到输入流 InputStream
4. new BufferReader(new InputStreamReader(new FileInputStream))
5.得到OutputStream 对象
6.调用  write()
7.shutdownOutput()
8.关闭资源

注意:运行的时候,要先运行服务器,再运行客户端

如果有两个客户端, 一个服务器,就会产生这样一个错误
Connection refused: connect
解决这个问题 : 用多线程解决这个问题 : 解决多个客户端对应一个服务器的问题
代码如下:(具体实现)

// 第一个客户端public static void main(String[] args) {try {Socket socket=new Socket("localhost",2328);OutputStream os=socket.getOutputStream();//InputStream is=socket.getInputStream();os.write("我要吃鸡腿".getBytes());socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();}}// 第二个客户端public static void main(String[] args) {try {Socket socket=new Socket("localhost",2328);OutputStream os=socket.getOutputStream();InputStream is=socket.getInputStream();os.write("我要吃大鸡腿".getBytes());socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();}}//线程
public class MyThread extends Thread {private Socket socket;public MyThread(Socket socket) {this.socket = socket;}// 重写服务器代码 run方法@Overridepublic void run() {try {// ServerSocket serverSocket = new ServerSocket(2328);// Socket socket=serverSocket.accept();InputStream is=socket.getInputStream();// OutputStream os=socket.getOutputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String str=null;while ((str=br.readLine())!=null){System.out.println(str);}} catch (IOException e) {e.printStackTrace();}}
}// 服务器public static void main(String[] args) {try {ServerSocket serverSocket=new ServerSocket(2328);Socket socket=null;while (true){socket=serverSocket.accept();MyThread myThread=new MyThread(socket);myThread.start();/* InputStream is=socket.getInputStream();OutputStream os=socket.getOutputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String str=null;while ((str=br.readLine())!=null){System.out.println(str);}socket.shutdownInput();socket.close();  */}} catch (IOException e) {e.printStackTrace();}}

使用socket实现文件上传的功能

// 客户端
public static void main(String[] args) {try {FileInputStream fis=new FileInputStream(new File("D:\\小电影2\\刘亦菲.jpg"));Socket socket=new Socket("localhost",10110);OutputStream os = socket.getOutputStream();byte[] b=new byte[1024];int leng=-1;while ((leng=fis.read(b))!=-1){os.write(b,0,leng);}socket.shutdownOutput();os.flush();os.close();} catch (IOException e) {e.printStackTrace();}}// 服务器public static void main(String[] args) {try {File file=new File("E:\\图片库");if (!file.exists()){file.mkdirs();}String str=System.currentTimeMillis()+"";File file1=new File(file,str+".jpg");FileOutputStream fos=new FileOutputStream(file1);ServerSocket serverSocket=new ServerSocket(10110);Socket socket=serverSocket.accept();InputStream is= socket.getInputStream();byte[] b=new byte[1024];int leng=-1;while ((leng=is.read(b))!=-1){fos.write(b,0,leng);fos.flush();}socket.shutdownInput();fos.close();} catch (IOException e) {e.printStackTrace();}}

socket实现文件上传的功能步骤总结

客户端:
1.读取出需要上传的图片
2 .通过socket拿到的输出流写入到服务器服务器:
1.通过socket拿到输入流把图片读取出来
注意:(1.需要创建一个文件夹来保存所有的图片,2.避免图片被覆盖)2.保存在本地以上都是基于tcp协议来进行操作的:面向连接  传输的时候不会丢失数据,但是传输慢

UDP
基于UDP协议进行传输,类似于发包裹

传输的类主要是 DatagramSocket 此类表示用来发送和接收数据报包的套接字

DatagramSocket构造方法:

 public DatagramSocket(int port,InetAddress laddr)  第一个数端口号    第二个参数是地址public DatagramSocket(int port)参数是端口号

常规的方法:

public void send(DatagramPacket p)throws IOException 发送数据包
public void receive(DatagramPacket p)throws IOException  接收数据包

两个重要的构造方法:

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int length)
DatagramPacket  此类表示数据报包  (包裹对象)
第一个参数是 字节数组
第二个参数是从字节数组的什么地方开始
第三个是到什么结束
第四个:获取的ip对象
第五个就是端口号

重要的方法:

public SocketAddress getSocketAddress() 返回的就是SocketAddress
public byte[] getData()   获取缓冲区的数据

客户端的步骤: 基于UDP的客户端

1.实例化这个对象
2.构建一个数据包
3..发送数据
4.关闭资源

服务器: 基于UDP的服务器

1. 实例化这个对象DatagramSocket
2. 构建一个包裹对象
3.接收数据  receive()
4.关闭资源

例子代码:

// 客服端public static void main(String[] args) {try {while (true){//String str="你好,我是客服端!";String str=new Scanner(System.in).next();DatagramSocket datagramSocket=new DatagramSocket();InetAddress inetAddress=InetAddress.getByName("localhost");DatagramPacket dp=new DatagramPacket(str.getBytes(),0,str.getBytes().length,inetAddress,8990);datagramSocket.send(dp);// 接收信息byte[] b=new byte[1024];DatagramPacket dp1=new DatagramPacket(b,b.length);datagramSocket.receive(dp1);byte[] by=  dp1.getData();System.out.println(new String(by,0,by.length));}} catch (IOException e) {e.printStackTrace();}}// 服务器public static void main(String[] args) {try {DatagramSocket datagramSocket=new DatagramSocket(8990);while (true){byte[] b=new byte[1024];DatagramPacket dp=new DatagramPacket(b,b.length);datagramSocket.receive(dp);byte[] by=dp.getData();System.out.println(new String(by,0,by.length));// 回复信息//String st="我已经接收到了。";String st=new Scanner(System.in).next();SocketAddress address=dp.getSocketAddress();DatagramPacket dp1=new DatagramPacket(st.getBytes(),0,st.getBytes().length,address);datagramSocket.send(dp1);}} catch (IOException e) {e.printStackTrace();}}

基于udp比较繁琐, 没有获取流对象的方法,所有只能够按照以上的方法区操作
开发使用的是第三方 环信与融云(sdk) tcp+udp 即时通信

二、总结

第二十三天的学习,今天学习了网络编程,主要学习了TCP与UDP协议以及基于两者的编程,内容比昨天少点,理解起来也没做昨天的难,而且今天学习的内容有点趣味性。加油干。

JavaDay23总结学习相关推荐

  1. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  2. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  3. FastAI 2019课程学习笔记 lesson 2:自行获取数据并创建分类器

    文章目录 数据获取 google_images_download 的安装和使用 挂载google 个人硬盘到Google colab中 删除不能打开文件 创建ImageDataBunch 训练模型 解 ...

  4. FastAI 课程学习笔记 lesson 1:宠物图片分类

    文章目录 代码解析 神奇的"%" 导入fastAI 库 下载解压数据集 untar_data 获取帮助文档 help() ? ?? doc 设置路径 get_image_files ...

  5. 深度学习学习指南-工具篇

    colab Colab是由Google提供的云计算服务,通过它可以让开发者很方便的使用google的免费资源(CPU.GPU.TPU)来训练自己的模型. 学习经验总结 如何使用命令行? 通过!+cmd ...

  6. Redis学习之路(一)--下载安装redis

    redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...

  7. python内置库之学习configparser库(一)

    python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...

  8. 前端Vue学习之路(二)-Vue-router路由

    Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...

  9. 前端Vue学习之路(一)-初识Vue

    Vue学习之路 (一) 1.引言 2.更换npm国内镜像源 3.用npm下载Vue 4.Vue全家桶 5.使用命令创建项目 5.推荐插件 6.推荐网站 7.学习扩展 1.引言 先安装node.js环境 ...

最新文章

  1. ubuntu配置ipv6
  2. 借用计算机不及时归还,陕西省农村信用社笔试试题(二)
  3. vscode Python 运行环境配置
  4. 事务模型与分布式事务总结思考
  5. 休眠面试问答-最终清单
  6. [html] html5的video如何附带字幕?
  7. java精确除法运算-BigDecimal
  8. 谷歌浏览器未发送任何数据_将 service worker 引入谷歌搜索
  9. GNSS文件下载网址
  10. jemalloc 内存分配器 是什么
  11. 2021武汉理工大学计算机考研初试经验总结
  12. centos linux系统后门程序
  13. c语言中calloc是什么意思,C语言中malloc和calloc以及relloc函数的区别
  14. softmax和sigmod的pytorch这些
  15. 向氏-姓氏家谱知识图谱构建
  16. SEO快排是什么?怎样实现快排?
  17. cisp-pte安全渗透工程师,如何成为安全渗透测试工程师?从认识网络安全威胁开始
  18. 【大数据】Big Data 大数据基本概念
  19. 关于公正执法的一点想法
  20. 项目:chatroom_websocket、网页聊天室

热门文章

  1. layui 动态绑定日期控件
  2. EDA(Cadence和AD)软件丝印调节的原则
  3. 物理方法与实践练习题
  4. CUGBACM22级暑假小学期训练-简单构造
  5. 世界上最经典的二十五句话
  6. 解决方案-joint_state_publisher process has died
  7. Java小程序简易多客户端聊天服务器
  8. js记录用户在网站的浏览记录和停留时间
  9. 爱你,为什么就不能在一起?
  10. MySQL主从异常Coordinator stopped because there were error(s) in the worker(s). The most recent failur