TCP 通信程序

63 阅读2分钟

一种可靠的网络协议,在通信的两端各自简历一个 SOCKET 对象 通信之前要保证连接已经建立 通过 SOCKET 产生 IO 流来进行网络通信。 socket 相当于连接通道。

image.png

在 tcp 通信程序下,如果不写 服务器代码,直接使用客户端代码去链接服务器应用,是会报错的 , 而 UDP 不会。

image.png

先启动服务端 accept 方法阻塞

image.png

客户端发送数据

image.png

示例代码

public class Client {
    public static void main(String[] args) throws IOException {
        // 创建socket
        Socket socket = null;
        try {
        // 在创建对象时 会连接服务器, 三次握手协议保证连接建立 连接通道
            socket = new Socket("127.0.0.1",Server.PORT);
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            // 用户输入信息
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            String msg = read.readLine();

            // 发送消息
            writer.write(msg + "\n");
            writer.flush();

            //  读取服务器返回的消息

            String s = reader.readLine();
            System.out.println( s);
        } finally {
            if (socket != null)
                socket.close();
        }
    }
}
public class Server {

    static final  int PORT = 9999;
    static ServerSocket serverSocket;
    public static void main(String[] args) throws IOException {
        try {
            serverSocket = new ServerSocket(PORT);
            System.out.println("服务启动成功,监听 PORT 端口");
            System.out.println(serverSocket);
            Socket accept = serverSocket.accept();
            System.out.println("客户端 [" + accept.getPort() + "] 已连接");
            BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
            // 读取客户端发送的消息
            String s = reader.readLine();
            if (s != null) {
                System.out.println("客户端 [" + accept.getPort() + "] :" +  s );
                writer.write("服务器 : " + s + "\n");
                writer.flush();
            }
        } finally {
            if (serverSocket != null){
                serverSocket.close();
            }
        }
    }
}

ps : 注意乱码问题,读取中文,不能一个字节一个字节读入。 由于一个汉字占 3个字节 , 读取一个输出则会 产生 乱码问题.

注意点是

在服务器接收数据完成之前,客户端才能够断开连接。 (四次挥手原则)。

什么是 TCP 三次握手?

  • 简单来说 客户端像服务器发送连接请求,等待服务器确认
  • 服务器向客户端返回一个响应,告诉客户端收到了请求
  • 客户端向服务器发出确认消息,连接建立。

具体的: 小林coding

什么是 TCP 四次挥手?(确保连接断开,且数据处理完毕)

  • 客户端向服务端发出取消连接请求。
  • 服务器向客户端返回一个响应,表示收到客户端取消请求
  • 服务器向客户端发出确认取消的消息(处理数据完毕)
  • 客户端再次发送确认消息,连接真正取消

具体的: 小林coding