Socket(套接字): 表示客户机和服务器连接通信。当两个程序需要通信时,他们可以通过使用Socket类建立套接字对象并连接在一起,通过具体的协议 写入写出数据 。

    Socket由端口号和IP地址组成。网络通信中使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序);端口号规定为一个16位的0~655535之间的整数,其中,0~1023被预先定义的服务通信占用,除非访问这些特定的服务,否则,就应该使用1024~65535这些端口的某一个进行通信,以免发生端口冲突。

    客户端上的使用
    1.getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。
    2.getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。

    服务器端上的使用
    1.getInputStream方法得到的是一个输入流,服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
    2.getOutputStream方法得到的是一个输出流,服务端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给客户端的数据

    Socket相关的通信协议
    1、TCP
    TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
    TCP的三次握手
    建立起一个TCP连接需要经过“三次握手”:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    1. 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求

    实现客户机和服务器都具有收发功能,且长连接。
    `public class Client {
    private Socket socket;
    public Client() {
    System.out.println(“客户机在启动”);
    while (true) {
    try {
    //1:创建Socket客户端对象
    socket = new Socket(“127.0.0.1”, 8891);
    System.out.println(“client:握手成功”);
    System.out.println(“客户机输入信息”);
    //2、向服务器写数据
    //(1)从键盘构建消息
    _BufferedReader br = new BufferedReader(new InputStreamReader(System.**_in
    ));
    String line = br.readLine();
    _//(2)把消息发送给服务器
    _PrintWriter pw =
    new PrintWriter(socket.getOutputStream());
    //(3)向文件写入line
    _pw.println(line);
    pw.flush();
    //接受服务器数据
    _BufferedReader br1=
    new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.
    out.println(“客户机接收的消息”+br1.readLine());
    }
    catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    public static void main(String[] args) {
    Client C=
    new **Client();
    }
    }

    <br />public class Server {
    private ServerSocket serverSocket=null;
    private Socket socket;

    1. **public **Server() {<br /> System.**_out_**.println(**"服务器在启动"**);<br /> **try **{<br /> **serverSocket **= **new **ServerSocket(8891);<br /> **while **(**true**) {<br /> **socket **= **serverSocket**.accept();<br /> _// System.out.println("服务器握手成功");<br /> //接受客户机的消息<br /> _BufferedReader br = **new **BufferedReader(**new **InputStreamReader(**socket**.getInputStream()));<br /> String line = br.readLine();<br /> System.**_out_**.println(**"服务器接收的消息为:" **+ line);<br /> _//向客户机写数据<br /> _BufferedReader br1 = **new **BufferedReader(**new **InputStreamReader(System.**_in_**));<br /> String line1 = br1.readLine();<br /> PrintWriter pw = **new **PrintWriter(**socket**.getOutputStream());<br /> pw.println(line1);<br /> pw.flush();<br /> }<br /> } **catch **(IOException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> **public static void **main(String[] args) {<br /> **new **Server();<br /> }<br />}`

    2、UDP: 不安全协议 只管发,谁接不管 电话短信 UDP协议

    3、http: 短连接,连接后就断开

    4、websocket 长连接

    [

    ](https://blog.csdn.net/u014209205/article/details/80461122)