TCP通信服务器端:
接收客户端请求,读取客户端数据并返回数据
表示服务器的类:java.net.ServerSocket
构造方法:
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
服务器端必须明确是哪个客户端请求的服务器
所以可以用accept()方法获取到连接的客户端Socket对象
成员方法:
Socket accept() 侦听并接受到此套接字的连接。

服务器的实现过程:
    1、创建服务器ServerSocket对象,和系统要指定的端口号
    2、使用创建服务器ServerSocket对象的accept()方法获取到连接的客户端Socket对象
    3、使用Socket 方法中的getOutputStream 获取网络字节输出流InputStream对象
    4、使用网络字节输出流InputStream对象中的read()读取客户端发送的数据
    5、使用Socket 方法中的getOutputStream()获取网络字节输出流OutputStream对象
    6、使用网络字节输出流OutputStream对象中的write写给客户端内容
    7、释放资源(Socket,ServerSocket)
public class TCPServer{
   
    public static void main(String[] args) throws IOException {
   
        //1、创建服务器ServerSocket对象,和系统要指定的端口号
        ServerSocket ss = new ServerSocket(5055);
        //2、使用创建服务器ServerSocket对象的accept()方法获取到连接的客户端Socket对象
        Socket socket = ss.accept();
        //3、使用Socket 方法中的getOutputStream 获取网络字节输出流InputStream对象
        InputStream inputStream = socket.getInputStream();
        //4、使用网络字节输出流InputStream对象中的read()读取客户端发送的数据
        byte[] bytes = new byte[1024];
        int len = inputStream.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5、使用Socket 方法中的getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream outputStream = socket.getOutputStream();
        //6、使用网络字节输出流OutputStream对象中的write写给客户端内容
        outputStream.write("收到嘻嘻!!".getBytes());
        //7、释放资源(Socket,ServerSocket)
        socket.close();
        ss.close();
    }
}

TCP客户端:
向服务器发送请求数据,服务器会回复信息
套接字:包含了IP+端口号
构造方法:
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
参数:InetAddress address 服务器的IP地址;int port服务器的端口号
成员方法:
InputStream getInputStream()
返回此套接字的输入流
OutputStream getOutputStream()
返回此套接字的输出流。
void close()
关闭此套接字。

步骤:
    1、创建客户端对象Socket,用构造方法绑定服务器的端口号和地址
    2、使用Socket 方法中的getOutputStream 获取网络字节输出流OutputStream对象
    3、使用网络字节输出流OutputStream对象中的write写给服务器内容
    4、使用Socket 方法中的getInputStream 获取网络字节输出流InputStream对象
    5、获取网络字节输出流InputStream对象的中的read方法读取服务器发送回来的数据
    6、释放资源(Socket)
注意事项:
    1、客户端和服务器交互必须使用Socket提供的网络流 不能使用自己创建的流对象
    2、当我们创建客户端对象Socket的时候,就会去请求服务器经过三次握手,如果服务器没有启用
    就会抛出异常java.net.ConnectException: Connection refused: connect
    如果已经启用了,就可以进行交互。
public class TCPClient {
   
    public static void main(String[] args) throws IOException{
   
        //1、创建客户端对象Socket,用构造方法绑定服务器的端口号和地址
        Socket socket = new Socket("127.0.0.1",5055);
        //2、使用Socket 方法中的getOutputStream 获取网络字节输出流OutputStream对象
        OutputStream outputStream = socket.getOutputStream();
        //3、使用网络字节输出流OutputStream对象中的write写给服务器内容
        outputStream.write("你好服务器".getBytes());
        //4、使用Socket 方法中的getInputStream 获取网络字节输出流InputStream对象
        InputStream inputStream = socket.getInputStream();
        //5、获取网络字节输出流InputStream对象的中的read方法读取服务器发送回来的数据
        byte[] bytes = new byte[1024];
        int len = inputStream.read(bytes);
        System.out.println(new String(bytes,0,len));
        //6、释放资源(Socket)
        socket.close();
    }
}