一、什么是TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。
其传输的可靠性依赖于三次握手和四次挥手。
二、三次握手(通俗)
三次握手我们可以认为是通信前的打招呼,其目的是为了防止数据丢失和无人响应。
注:当然在真是的情况中,三次握手肯定会更加的复杂,会带有很多参数,我在这里只是做一个通俗的解释。
三、四次挥手(通俗)
四次挥手是在断开连接前的相互打招呼,其目的是防止浏览器一直等待对方给自己发消息,避免造成资源的浪费
注:当然在真是的情况中,四次挥手肯定会更加的复杂,会带有很多参数,我在这里只是做一个通俗的解释。
四、代码实现前的补充
大概流程:
1.对于service
对于service而言,其要占用一个端口号,提供给发送方使用
1、java有一个类是Class ServerSocket
其构造方法如下:
对于上述的构造方法中有一个ServerSocket(int port),通过这个方法来指定端口
ServerSocket socket = new ServerSocket(1234);
2、通过accep() 来侦听要连接到此套接字并接受它,返回值是一个Socket对象
Socket accept = socket.accept();
3、对于Socket对象,其有一个方法是getInputStream()
InputStream is = accept.getInputStream();
4、得到输入流了,就可以随心所欲的进行IO操作了
1.对于client/browse
client在给service发送消息会文件时,要知道两个东西,第一个是要知道对方的host,第二个是对方要知道开放的端口号(port)。
1、在InetAddress类中有一个如下的静态方法,可以通过IP获取对方主机的host
InetAddress host = InetAddress.getByName("127.0.0.1");
2、在java中有Socket类,其中有一个构造方法如下,可以创建对应接口的套接字Socket
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),1234);
3、在Socket类中有获取套接字输出流的方法
OutputStream os = socket.getOutputStream();
五、源码
client:
package Dome.inet.tcp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* @author : HuXuehao
* @date : 2021年5月31日上午6:21:53
* @version : TCP实现文件的上传与下载
*/
public class TcpClientDome2 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
FileInputStream is = null;
try {
//与服务器建立连接
socket = new Socket(InetAddress.getByName("127.0.0.1"),1234);
//获取去输出流,给服务器发送消息
os = socket.getOutputStream();
//读入待发送文件
is = new FileInputStream(new File("1.docx"));
byte[] buffer = new byte[1024];
int len = 0;
//读入
while((len=is.read(buffer))!=-1) {
//发送
os.write(buffer, 0, len);
}
System.out.println("ok");
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
if(is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
service:
package Dome.inet.tcp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author : HuXuehao
* @date : 2021年5月31日上午6:29:40
* @version :
*/
public class TcpServerDome2 {
public static void main(String[] args) {
ServerSocket socket = null;
Socket accept = null;
InputStream is = null;
FileOutputStream os = null;
try {
//打开一个端口/占用一个端口/指定一个端口
socket = new ServerSocket(1234);
//等待用户发送的消息,等待接收
accept = socket.accept();
//读入文件,用于接收用户发送的文件使用
is = accept.getInputStream();
//写入文件,将将用户的文件进行保存
os = new FileOutputStream(new File("2.docx"));
byte[] buffer = new byte[1024];
int len = 0;
//读入
while((len=is.read(buffer))!=-1) {
//写入
os.write(buffer, 0, len);
}
System.out.println("ok");
} catch (IOException e) {
e.printStackTrace();
}finally {
//挂芭比资源
if(os!=null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(accept!=null) {
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
执行顺序:先执行service,再执行client
执行前:
执行后: