目录

  • TCP 通信程序
  • 1. TCP 协议概述
  • 2. TCP 通信案例
  • a. 客户端向服务器发送数据
  • b. 服务器向客户端回写数据
  • c. 输出结果



TCP 通信程序

1. TCP 协议概述

  • TCP 协议是面向连接的通信协议,即在传输数据前先在客户端和服务器端建立逻辑连接,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输。TCP 通信过程如下图所示:

TCP ==> Transfer Control Protocol ==> 传输控制协议
TCP 协议的特点
* 面向连接的协议
* 只能由客户端主动发送数据给服务器端,服务器端接收到数据之后,可以给客户端响应数据。
* 通过三次握手建立连接,连接成功形成数据传输通道。
* 通过四次挥手断开连接
* 基于 IO 流进行数据传输
* 传输数据大小没有限制
* 因为面向连接的协议,速度慢,但是是可靠的协议。

TCP 协议的使用场景
* 文件上传和下载
* 邮件发送和接收
* 远程登录

TCP 协议相关的类
* Socket
* 一个该类的对象就代表一个客户端程序。
* ServerSocket
* 一个该类的对象就代表一个服务器端程序。

Socket 类构造方法
* Socket(String host, int port)
* 根据 IP 地址字符串和端口号创建客户端 Socket 对象
* 注意事项:只要执行该方法,就会立即连接指定的服务器程序,如果连接不成功,则会抛出异常。
如果连接成功,则表示三次握手通过。

Socket 类常用方法
* OutputStream getOutputStream(); 获得字节输出流对象
* InputStream getInputStream(); 获得字节输入流对象


2. TCP 通信案例

a. 客户端向服务器发送数据

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 TCP服务器端代码实现

 ServerSocket类构造方法
 * ServerSocket(int port) 根据指定的端口号开启服务器。

 ServerSocket类常用方法
 *  Socket accept() 等待客户端连接并获得与客户端关联的Socket对象

 TCP服务器端代码实现步骤
 * 创建ServerSocket对象并指定端口号(相当于开启了一个服务器)
 * 调用ServerSocket对象的accept方法等待客端户连接并获得对应Socket对象
 * 调用Socket对象的getInputStream方法获得字节输入流对象
 * 调用字节输入流对象的read方法读取客户端发送的数据
 * 调用Socket对象的getOutputStream方法获得字节输出流对象
 * 调用字节输出流对象的write方法往客户端输出数据
 * 关闭Socket和ServerSocket对象
 */
public class TCPServer {
    public static void main(String[] args)throws Exception{
        System.out.println("I am Server.");
        // 创建服务器ocket对象
        ServerSocket serverSocket = new ServerSocket(9000);
        // 等待客户端连接并获得与客户端关联的Socket对象
        Socket socket = serverSocket.accept();
        // 获得字节输入流对象
        InputStream in = socket.getInputStream();
        // 创建字节数组:用来存储读取到客户端发送的数据
        byte[] buf = new byte[1024];
        // 读取客户端发送过来的数据
        int len = in.read(buf);
        System.out.println("Client send: " + new String(buf,0,len));
        System.out.println("Length of content = " + len);

        // 获得字节输出流对象
        OutputStream out = socket.getOutputStream();
        // 往客户端输出数据
        out.write("Here.".getBytes());

        // 关闭socket
        socket.close();
        // 关闭服务器(在实际开发中,服务器一般不会关闭)
        serverSocket.close();
    }
}

b. 服务器向客户端回写数据

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
TCP客户端代码实现步骤
        * 创建客户端Socket对象并指定服务器地址和端口号
        * 调用Socket对象的getOutputStream方法获得字节输出流对象
        * 调用字节输出流对象的write方法往服务器端输出数据
        * 调用Socket对象的getInputStream方法获得字节输入流对象
        * 调用字节输入流对象的read方法读取服务器端返回的数据
        * 关闭Socket对象断开连接。
 */
// TCP客户端代码实现
public class TCPClient {
    public static void main(String[] args) throws Exception{
        System.out.println("I am Client.");
        // 要发送的内容
        String content = "Where is Regino's Bidirectional Transmission?";
        // 创建Socket对象
        Socket socket = new Socket("127.0.0.1",9000);
        // System.out.println(socket);
        // 获得字节输出流对象
        OutputStream out = socket.getOutputStream();
        // 输出数据到服务器端
        out.write(content.getBytes());

        // 获得字节输入流对象
        InputStream in = socket.getInputStream();
        // 创建字节数组:用来存储读取到服务器端数据
        byte[] buf = new byte[1024];
        // 读取服务器端返回的数据
        int len = in.read(buf);
        System.out.println("Server send: " + new String(buf,0,len));
        System.out.println("Length of content = " + len);

        // 关闭socket对象
        socket.close();
    }
}

c. 输出结果

java tcp发送队列怎么持久化_客户端


java tcp发送队列怎么持久化_java_02