【TCP通信原理】
【概述】:
- TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。
- 通信之前要保证连接已经建立。
- 通过Socket产生IO流来进行网络通信。
【连接原理】
【三次握手协议】
【四次挥手协议】
【TCP发送数据】——客户端
【步骤】:
- 创建客户端的Socket对象(Socket)与指定服务端连接 Socket(String host, int port)
- 获取输出流,写数据 OutputStream getOutputStream()
- 释放资源 void close()
例:
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 10001);
OutputStream os = socket.getOutputStream();
os.write("hello".getBytes(StandardCharsets.UTF_8));
os.close();
socket.close();
}
【TCP接收数据】——服务器
【步骤】:
- 创建服务器端的Socket对象(ServerSocket) ServerSocket(int port)
- 监听客户端连接,返回一个Socket对象 Socket accept()
- 获取输入流,读数据,并把数据显示在控制台 InputStream getInputStream()
- 释放资源 void close()
例:
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10001);
Socket accept = ss.accept();
InputStream is = accept.getInputStream();
int b;
while ((b = is.read()) != -1) {
System.out.print((char)b);
}
is.close();
ss.close();
}
【注意】
- accept()方法是阻塞的,作用就是等待客户端连接
- 客户端创建对象并连接服务器,此时是通过三次握手协议保证跟服务器之间的连接
- 针对客户端来讲,是往外写的,所以是输出流
- 针对服务器来讲,是往里读的,所以是输入流
- read()方法也是阻塞的
- 在关流的时候,还多了一个往服务器写结束标记的动作
- 最后一步断开连接,通过四次挥手协议保证连接终止
【TCP通信——示例项目】
客户端:发送数据,接收服务器反馈
服务器:接收数据,给出反馈
//服务器
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10002);
Socket accept = ss.accept();
InputStream is=accept.getInputStream();
int b;
while ((b= is.read())!=-1){
System.out.println((char) b);
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("你谁啊?");
bw.newLine();
bw.flush();
bw.close();
is.close();
accept.close();
ss.close();
}
//客户端
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",10002);
OutputStream os=socket.getOutputStream();
os.write("hello".getBytes(StandardCharsets.UTF_8));
socket.shutdownOutput();
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line= br.readLine())!=null){
System.out.print(line);
}
br.close();
os.close();
socket.close();
}
【TCP通信——示例项目】
客户端:将本地文件上传到服务器。接收服务器的反馈。
服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//客户端
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 10003);
//读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("socket\\ClientDir\\img.jpg"));
//写到服务器
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
bos.flush();
socket.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
bis.close();
socket.close();
}
//服务器
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10003);
Socket accept = ss.accept();
//网络中的流
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//本地中的流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("socket\\ServerDir\\image.png");
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("上传成功");
bw.newLine();
bw.flush();
bos.close();
accept.close();
ss.close();
}