java基础之TCP协议

107 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

TCP协议

使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。而无连接协议UDP则非常适合于广播和多播。

字节流服务和数据报服务的这种区别对应到实际编程中,则体现为通信双方是否必须执行相同次数的读、写操作

1.1 TCP通信原理

  • TCP通信协议是一种可靠的网络协议, 它在通信的两端名建立一个Socke对象, 从而在通信的两端形成网络虚拟链路
  • 一旦建立了 虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
  • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生l0流来进行网络通信
  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

2.2 TCP发送数据

  • 发送数据的步骤
    • 1、创建客户端的Socket对象(Socket):Socket(String host, int port)
    • 2、获取输出流,写数据:OutputStream对象的getOutputStream()方法
    • 3、释放资源:void close()
  • 范例:
package test;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1、创建客户端的Socket对象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);

        //2、获取输出流,写数据:OutputStream对象的getOutputStream()方法
        OutputStream os = s.getOutputStream();
        os.write("hello,java".getBytes());

        //3、释放资源:void close()
        s.close();
    }
}

1.3 TCP接收数据

  • 接收数据的步骤

    • 1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
    • 2、监听客户端连接, 返回个Socket对象:Socket accept()
    • 3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
    • 4、释放资源:void close()
  • 范例

package test;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、创建服务 器端的Socket对象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);

        //2、监听客户端连接, 返回个Socket对象:Socket accept()
        Socket s = ss.accept();

        //3、获取输入流, 读数据,并把数据显示在控制台:InputStream对象的getInputStream()方法
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1014];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println(data);

        //4、释放资源:void close()
        s.close();
        ss.close();
    }
}