心得:

我是一名正在自学的java的即将毕业的大学生

总结笔记是为了让自己更好的理解和加深印象。可能不是那么美观,自己可以看懂就好

所有的文档和源代码都开源在GitHub: https://github.com/kun213/JavaNotes上了。希望我们可以一起加油,一起学习,一起交流

day14 【网络编程】

@

一、网络编程入门

1.1 可以说出软件的结构

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

B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。

1.2 可以说出UDP和TCP协议特点

  • TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

      • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
      • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
      • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。

  • UDP:用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。

    每次发送的数据最大为64kb。

二、TCP通信协议

2.1 可以说出TCP协议下两个常用类名称

在Java中,提供了两个类用于实现TCP通信程序:

  • 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
  • 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

2.2 如何编写TCP协议下字符串数据传输程序

实现TCP通信的客户端程序:

/**
* 实现TCP通信的客户端程序
*
* java.net.Socket 实现客户端的套接字对象,连接对象
*
* 需求: 客户端程序和服务器程序实现数据交换
*
* 实现步骤:
* 1: 创建Socket对象 (主动连接服务器)
* Socket(String host, int port)
*
* 2: OutputStream getOutputStream()
* 返回套接字中的字节输出流
* 方法write写入数据, 写到服务器
*
* 3: InputStream getInputStream()
* 返回套接字中的字节输入流
* 方法read读取数据,读取的是服务器发回来的数据
*
* 4: 释放资源
*/
public class TCPClient {
public static void main(String[] args)throws IOException {
//创建Socket对象 (主动连接服务器)
Socket socket = new Socket("127.0.0.1",9000); //OutputStream getOutputStream()
OutputStream out = socket.getOutputStream();
//字节流的方法写数据
out.write("你好服务器".getBytes());//没有写到文件中,写到了服务器中 InputStream in = socket.getInputStream();//获取字节输入流
byte[] bytes = new byte[1024];
int len = in.read(bytes);//客户端输入流,读取到服务器发回来的数据
System.out.println(new String(bytes,0,len)); //释放资源
//out.close();
socket.close();
}
}

实现TCP通信的服务器程序:

/**
* 实现TCP通信的服务器程序
* 192.168.27.95
* java.net.ServerSocket 实现TCP协议中的服务器套接字对象
*
* 实现TCP服务器程序步骤:
* 1: 创建ServerSocket对象
* ServerSocket(int port) 端口号
*
* 2: 等待客户端的连接,如果没有客户端连接,永远等待
* ServerSocket类方法 accept()同意
* 方法 accept()返回值是 Socket对象 (客户端的连接对象,包含客户端的IP)
*
* 3: Socket对象中获取到字节输出流
* OutputStream getOutputStream()
* 方法write写数据,写到客户端
*
* 4: Socket对象中获取到字节输入流
* InputStream getInputStream()
* 方法read读取数据,读取的是客户端发来数据
*
* 5: 释放资源
*/
public class TCPServer {
public static void main(String[] args)throws IOException {
//创建ServerSocket对象
ServerSocket server = new ServerSocket(9000);
//ServerSocket类方法 accept()同意
Socket socket = server.accept();
//System.out.println(socket); //使用客户端连接获取对象,输入流
InputStream in = socket.getInputStream();
//in输入流的方法read()读取客户端发来数据
byte[] bytes = new byte[1024];
//len返回的是读取到的字节个数
int len = in.read(bytes);
System.out.println(new String(bytes,0,len)); //Socket客户端对象,获取字节输出流
OutputStream out = socket.getOutputStream();
out.write("收到!".getBytes());//服务器输出流,写回客户端 //释放资源
socket.close();
server.close();
}
}

2.3 理解TCP协议下文件上传案例

实现图片上传客户端:

/**
* 实现TCP图片上传客户端
* 实现步骤:
* 1: 创建Socket对象,连接服务器
* 2: FileInputStream读取 mm.jpg 字节数组
* 3: Socket对象获取字节输出流
* 字节数组,交给输出流,写到服务器
* 4: Socket对象获取字节输入流
* 全部的图片发送完毕
* 输入流,读取服务器回来的提示信息 "上传成功"
*
* 客户端方法Socket: shutdownOutput() 终止连接对象的输出流 ,
* 同时跟上TCP终止序列
* 5: 释放资源
*/
public class TCPClient {
public static void main(String[] args) throws IOException{
//1: 创建Socket对象,连接服务器
Socket socket = new Socket("127.0.0.1",9000);
//2: 自己的字节输入流,读取图片mm.jpg
FileInputStream fis = new FileInputStream("e:/msh.jpg");
//3: Socket对象获取字节输出流
OutputStream out = socket.getOutputStream();//任何数据,写向服务器
byte[] bytes = new byte[1024];
int len = 0;
//fis读取文件末尾,JVM返回read() -1
while ((len = fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
//告诉服务器,没数据了,别读,服务器发送TCP的终止符
socket.shutdownOutput();
//4:Socket对象获取字节输入流
InputStream in = socket.getInputStream();//输入流,读取服务器回来的数据
len = in.read(bytes);
System.out.println("服务器提示::"+new String(bytes,0,len)); socket.close();
}
}

实现图片上传服务器端:

/**
* 实现图片上传服务器端
* 实现步骤:
* 1: 创建对象ServerSocket 绑定端口
* 2: Socket accept()方法等待客户端连接
* 3: Socket对象,获取字节输入流,读取客户端发来图片的字节
* 4: 创建字节输出流,读取到图片,写到 e:/upload
* 5: Socket对象,获取字节输出流,"上传成功"写回客户端
*
* bug:
* 1: 演示了2次,为什么文件夹中只有一个文件,同名覆盖
* a: 1.jpg
* b: 1.jpg
*
* 2: 客户端收不到服务器的上传成功
//告诉服务器,没数据了,别读,服务器发送TCP的终止符
*/
public class TCPServer {
public static void main(String[] args) throws IOException{
//1: 创建对象ServerSocket 绑定端口
ServerSocket server = new ServerSocket(9000);
// 2: Socket accept()方法等待客户端连接
Socket socket = server.accept();
//3: Socket对象,获取字节输入流,读取客户端发来图片的字节
InputStream in = socket.getInputStream();
//4: 创建字节输出流,读取到图片,写到 e:/upload
//上传的文件,重命名,获取当前日期 转换成字符串
String filename = new SimpleDateFormat("yyyyMMddHHmmssssss").format(Calendar.getInstance().getTime())+".jpg";
FileOutputStream fos = new FileOutputStream("e:/upload/"+filename);
byte[] bytes = new byte[1024];
int len = 0;
//read()读取是客户端写来的图片!!
while ( (len = in.read(bytes))!=-1){
fos.write(bytes,0,len);
} //5: Socket对象,获取字节输出流,"上传成功"写回客户端
OutputStream out= socket.getOutputStream();
out.write("上传成功!".getBytes()); socket.close();
server.close();
}
}

这是我的公众号,希望大家可以关注,让我们一起做最好的自我。

我也会把我自学视频分享在上面,供大家一起学习。


JAVA学习线路:day14-网络编程的更多相关文章

  1. Java学习图形界面+网络编程案例---------网络简易通讯

    主要思想: 主类继承JPanel,在构造方法中将JFrame设成空布局:在其中适当位置添加组件:实现事件监听处理 DATE:2015-10-31 服务器端代码: /** * @author Oyc * ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

  4. 20165310 Java实验五《网络编程与安全》

    20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...

  5. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  6. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  7. Java学习之AWT GUI编程

    Java学习之AWT GUI编程 0x00 前言 既然前面提到了要重写冰蝎和一些反序列化工具,当然就不能随便说说而已.在编写这些工具还是要使用图形化工具来的方便一些,所以提前把GUI的框架给学习一遍. ...

  8. Java学习之Swing Gui编程

    Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...

  9. nodejs学习笔记之网络编程

    了解一下OSI七层模型   OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端  TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化 ...

随机推荐

  1. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...

  2. C++中union的使用方法

    转载:https://blog.csdn.net/hou09tian/article/details/80816445 1 概述 1.1 定义 union即为联合,它是一种特殊的类.通过关键字unio ...

  3. Python 3.9 新特性速览

    国庆假期,Python 社区发布了 3.9 版本的第一个 stable release. 相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python"使用者" ...

  4. SpringCache整合Redis

    之前一篇文章 SpringBoot整合Redis 已经介绍了在SpringBoot中使用redisTemplate手动 操作redis数据库的方法了.其实这个时候我们就已经可以拿redis来做项目了, ...

  5. MySQL 日志详解

    一.MySQL 日志分类 MySQL 日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 错误日志: -log-err (记录启动.运行.停止 MySQL 服务时出现的信息) 查询日 ...

  6. Windows10系统下wsappx占用CPU资源过高?wsappx是什么?如何关闭wsappx进程?

    在Windows10系统开机的时候,wsappx进程占用的CPU资源非常高,导致电脑运行速度缓慢,那么我们如何关闭wsappx进程,让电脑加快运行速度呢?下面就一起来看一下操作的方法吧. [现象] 1 ...

  7. object-fit 详解

    contain 被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比. 整个对象在填充盒子的同时保留其长宽比,因此如果宽高比与框的宽高比不匹配,该对象将被添加"黑边". cov ...

  8. h2database在springboot中的使用

    h2为轻量级数据库,使用特别方便,它可以不使用数据库服务器,直接嵌入到java程序中.可以配置持久化,同样也可以不持久化(数据在内存中)进程结束后,数据就释放,用做测试和演示特别方便.自带后台管理,非 ...

  9. 实验 5:OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接:通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...

  10. antd pro 下的文件下载

    概要 示例 后端 前端 直接显示图片 提供下载链接, 点击后下载 文件导出, 前端没有显示下载链接的位置 概要 前端上传文件的例子很多, 但是下载相关的例子不多, 主要是因为下载本身比较简单. 但是这 ...