说明:相关构造方法及使用步骤等在代码注释等内容中,有些地方需要捕获异常,正式写的时候一定要捕获或者抛出,否则编译异常!!!
严格区分客户端和服务端
两端通信时步骤:

1.服务端程序,需要事先启动,等待客户端的连接。它不会主动的请求客户端

2.客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。这个连接种包含一个对象,这个对象是IO对象,可以通过这个对象进行通信,通信的数据不仅仅是字符,所以IO对象是字节流对象。
在java中,提供了两个类用于实现TCP通信程序

1.客户端:java.net.Socket类表示。创建Socket对象,向服务端发送连接请求,服务端响应请求,两者建立连接开始通信。此类实现客户端套接字(也可以就叫套接字),套接字是两台机器间通信的端点。套接字其实就是包含了IP地址和端口号的网络单位,也是一台计算机
构造方法:
	Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号
    参数:host:服务器主机的名称/服务器的IP地址
    	 port:服务器的端口号

成员方法:
    OutputStream getOutputStream():返回此套接字的输出流
    InputStream getInputStream():返回此套接字的输入流
    void close():既然使用到流传递了,那么使用完后要关闭套接字
    
实现步骤:
    1.创建一个客户端对象Socket,构造方法绑定服务器的IP和端口号
    2.使用getOutputStream方法获取网络字节输出流OutputStream对象
    3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
    4.使用getInputStream方法获取网络字节输入流对象
    5.使用read方法读取服务器回写的数据
    6.释放资源,关闭Socket,因为流是从它里边获取的
    
注意:
    1.客户端和服务器进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象
    2.3次握手,建立连接通路。这时如果服务器没有启动,就会抛出异常。ConnectException
 
    
    //客户端!!!!!!
public class Demo{//会有异常,记得及时处理
    main{
        //1.创建一个客户端对象Socket,构造方法绑定服务器的IP和端口号
        Socket socket = new Socket("127.0.0.1",8888);
        //2.使用getOutputStream方法获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
        os.write("你好服务器".getBytes());
        //4.使用getInputStream方法获取网络字节输入流对象
        InputStream is = socket.getInputStream();
        //5.使用read方法读取服务器回写的数据
        byte[] bytes = new byte[1024];
		int len = is.read(bytes);
		System.out.println(new String(bytes,0,len));
        //6.释放资源,关闭Socket,因为流是从它里边获取的
        socket.close();
    }
}
2.服务端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接,该类实现服务器套接字
构造方法:
    //端口号要一样,不然就是系统随机分配的了,它必须知道请求的客户端对象,可以使用accept方法
    ServerSocket(int port)创建并绑定特定端口的服务器套(接字
    
成员方法:
    Socket accept()监听并接收到此套接字的连接
                                         
实现步骤:
    1.创建对象和指定的端口号
    2.使用accept方法,获取请求的客户端
    3.使用getInputStream方法获取网络字节输入流对象,使用read方法读取客户端的数据
    4.使用getOutputStream方法获取网络字节输出流OutputStream对象
    5.使用write方法给客户端回写数据
    6.释放资源,关闭Socket和ServerSocket
  
    //1.创建对象和指定的端口号                                     
ServerSocket server = new ServerSocket(8888);
    //2.使用accept方法,获取请求的客户端
Socket socket = server.accept();
    //3.使用getInputStream方法获取网络字节输入流对象,使用read方法读取客户端的数据
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
    //4.使用getOutputStream方法获取网络字节输出流OutputStream对象 
OutputStream os = socket.getOutputStream();
    //5.使用write方法给客户端回写数据 
os.write("收到谢谢".getBytes());
    //6.释放资源,关闭Socket和ServerSocket 
socket.close();
server.close();