-
第二次见面,某女说:XX,我收到你的消息和礼物了,你要对人家负责啊,也给你个礼物
-
第三次见面,某男说:XX,我收到你的礼物了,太好了,我会对你负责的。
四次挥手:
-
第一次挥手: 客户端发送FIN=M给服务器,客户端进入FIN_WAIT_1状态
-
第二次挥手: 服务器收到FIN=M后,发送ack=M+1给客户端,服务端进入CLOSE_WAIT状态
-
第三次挥手: 服务器发送FIN=N给客户端,服务端进入LAST_ACK状态
-
第四次挥手: 客户端收到FIN=N后进入TIME_WAIT状态,发送标志位ACK=1,确认序号ack=K+1,服务器收到后进入CLOSED状态,连接关闭。
简单来说:类似某男和某女分手
-
第一次挥手,某男给某女发消息:XX,我们不合适,分手吧
-
第二次挥手,某女说:XX,我知道了,你是个渣男,我早就想和你分手了,等着我去收拾东西
-
第三次挥手,某女说:XX,东西我收拾好了,拜拜吧
-
第三次挥手,某男说:XX,知道了,我们再也不见!
=====================================================================
TCP和UDP同属于传输层协议,对比TCP和UDP:
| | UDP | TCP |
| :-- | :-- | — |
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不可靠传输 | 可靠传输 |
| 连接个数 | 支持一对一,一对多,多对多通信 | 只能是一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
======================================================================
Socket基于TCP/IP协议,用于客户端和服务器端通信。
网络套接字,用于连接另一台计算机
创建方法:
new Socket(“IP地址”,端口号)
注意:一旦创建了Socket对象,就自动连接对方计算机
常用方法:
-
getInputStream() 获得输入流,读取对方发来的数据
-
getOutputStream() 获得输出流,给对方发数据
-
close() 关闭
注意:一旦输入流或输出流关闭,Socket连接会自动关闭。
服务器端Socket,Socket的子类,用于接受客户端并和客户端通信
创建:
new ServerSocket(端口号)
注意:一旦创建ServerSocket对象,会不断侦听该端口,判断是否有客户端连接
主要方法:
- Socket accept() 用于获得连接过来的客户端Socket对象
服务器端实现步骤:
-
创建ServerSocket对象
-
循环调用accept方法获得连接
-
调用Socket对象的IO流来读取、发送数据。
public class Server {
public static final int PORT = 8888;
public void start(){
System.out.println(“启动服务器。。。”);
//创建ServerSocket对象
try {
ServerSocket server = new ServerSocket(PORT);
//循环获得客户端连接
while(true){
Socket client = server.accept();
System.out.println(client.getInetAddress()+“连接了”);
//获得客户端的输入流和输出流
try(DataInputStream dis = new DataInputStream(client.getInputStream());
DataOutputStream dos = new DataOutputStream(client.getOutputStream())){
//读取客户端的消息
System.out.println(“客户端”+client.getInetAddress()+“说:”+dis.readUTF());
//给客户端发消息
dos.writeUTF(“我是服务器端,客户端你好啊~~~~~~~~~~~~~~~~”);
}catch(IOException ex){
ex.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server().start();
}
}
客户端实现步骤:
-
创建Socket对象
-
调用Socket对象的getInputStream来读取数据。
-
调用Socket对象的getOutputStream来发送数据。
public class Client {
public void sendMessage(String ip,int port,String msg){
//创建Socket对象,连接服务器端
try {
Socket socket = new Socket(ip,port);
//获得输出流和输入流
try(DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream())){
//发送数据给服务器端
dos.writeUTF(msg);
//读取服务器端的消息
System.out.println(“服务器端说:”+dis.readUTF());
}catch(Exception ex){
ex.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Client().sendMessage(“192.168.53.5”, 8888,
“你好!!!服务器端”);
}
}
文件的上传的步骤
服务器端:
-
创建ServerSocket
-
调用accept获得客户端Socket
-
定义字节数组
-
创建文件输出流,获得客户端输入流
-
循环读取输入流的字节,写入到文件输出流
客户端:
-
创建Socket
-
获得socket对象输出流
-
创建文件输入流
-
循环读取文件输入流字节,写入到输出流
public class FileServer {
public static final int PORT = 8888;
public static final String DIR = “C:\upload\”;
public void start(){
System.out.println(“start…”);
//创建服务器端对象
try (ServerSocket server = new ServerSocket(PORT)😉{
//调用accept接受客户端连接
while(true){
Socket socket = server.accept();
//创建文件输出流和网络输入流
try(ObjectInputStream in = new ObjectInputStream(
socket.getInputStream());
//读取客户端发来的文件名,创建文件输出流
OutputStream out =
new FileOutputStream(DIR+in.readUTF())😉{
//从网络中读取数据,写入到本地磁盘
int len = 0;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
System.out.println(“服务器保存完毕”);
}catch(IOException ex){
ex.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new FileServer().start();
}
}
public class FileClient {
/**
- 发送文件
*/
public void sendFile(String ip,int port,String path){
File file = new File(path);
//创建连接,创建文件输入流,网络输出流
try(Socket socket = new Socket(ip,port);
InputStream in = new FileInputStream(path);
ObjectOutputStream out = new ObjectOutputStream(
socket.getOutputStream())){
//先发送文件名给服务器
out.writeUTF(file.getName());
out.flush();
//读取本地文件数据,写入到网络输出流中
int len = 0;
byte[] buffer = new byte[1024];
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
System.out.println(“客户端发送完毕”);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new FileClient().sendFile(“127.0.0.1”, 8888,
“D:\java_code\Test10.java”);
}
}
HTML服务器的简单工作原理:
-
用户在浏览器输入URL地址
-
浏览器发送请求给服务器
-
服务器从请求头中解析信息:请求方法、URL等
-
从URL中解析到资源名称,就到服务器上查找HTML文件
-
服务器发送响应状态给浏览器
-
服务器发送响应头给浏览器
-
服务器开始发送HTML文件的内容
-
浏览器接收到HTML内容渲染出来
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
8年进入阿里一直到现在。**
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-KNoqrNOK-1715415156134)]
[外链图片转存中…(img-qbqcYJqG-1715415156135)]
[外链图片转存中…(img-daLyIKf8-1715415156135)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!