转载

[Java] TCP 通信程序


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. 输出结果

在这里插入图片描述
在这里插入图片描述


原文链接:https://qwert.blog.csdn.net/article/details/105062817

正文到此结束
本文目录