Java 网络编程TCP协议之发送数据和接收数据的详解

简介: Java 网络编程TCP协议之发送数据和接收数据的详解

TCP协议:

  1. 传输控制协议(Transmission Control Protocol)
  2. TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都要经历“三次握手”。
  3. 三次握手: TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
    第一握手,客户端向服务器发出连接请求,等待服务器确认。
    第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
    第三次握手,客户端再次向服务器端发送确认消息,确认连接。
  4. 完成三次握手,连接建立后,客户端和服务器就可以开始数据传输了。由于这种面向连接的特性,TCP协议可以保证数据传输的安全,所以应用十分广泛,例如上传文件,下载文件,浏览网页等。

接下来我们看下面这张图来再次理解三次握手

接下来我们来使用TCP发送数据,和接收数据

一、创建一个类来发送数据,代码如下,注释已经在代码中给出

/*
      TCP发送数据的步骤:
      1.创建客户端的Socket对象(Socket)
      2.获取输出流,写数据
      3.释放资源
   */
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket)
        //Socket(InetAddress address,int port) 创建流套接字并将其连接到指定ip地址的指定端口号
//        Socket socket = new Socket(InetAddress.getByName("192.168.0.124"),10000);
        //Socket(String host,int port) 创建流套接字并将其连接到指定主机上的指定端口号
        Socket socket = new Socket("192.168.0.124", 10000);
        //获取输出流,写出数据
        OutputStream os = socket.getOutputStream();
        os.write("hello,TCP,我来了".getBytes());
        //释放资源
        socket.close();
    }
}

二、接收客户端发送来的数据,显示在控制台

/*
        TCP接收数据的步骤:
            1.创建服务器端的Socket对象(ServerSocket)
            2.获取输入流,读数据,并把数据显示在控制台上
            3.释放资源
     */
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        //ServerSocket(int port)创建绑定到指定端口的服务器套接字
        ServerSocket serverSocket = new ServerSocket(10000);
        //Socket accept() 侦听要连接到此套接字并接受它
        Socket socket = serverSocket.accept();
        //获取输入流,读数据,并把数据显示到控制台
        InputStream is = socket.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys, 0, len);
        System.out.println("数据是:" + data);
        //释放资源
        serverSocket.close();
    }
}

之后我们来通过一个练习,来加深TCP的使用

一、客户端发送数据,接收服务器反馈

/*
    客户端:发送数据,接收服务器反馈
 */
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象
        Socket socket = new Socket("192.168.0.124", 10000);
        //获取输出流,写数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,TCP,我来了".getBytes());
        //接收服务器的反馈
        InputStream inputStream = socket.getInputStream();
        byte[] bys = new byte[1024];
        int len = inputStream.read(bys);
        System.out.println("客户端:" + new String(bys, 0, len));
        //释放资源
        socket.close();
    }
}

二、服务器:接收数据,给出反馈

/*
    服务器接收数据,给出反馈
 */
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        ServerSocket serverSocket = new ServerSocket(10000);
        //监听客户端连接,返回一个Socket对象
        Socket socket = serverSocket.accept();
        //获取输入流,读数据,并把数据显示在控制台
        InputStream inputStream = socket.getInputStream();
        byte[] bys = new byte[1024];
        int len = inputStream.read(bys);
        System.out.println("服务器:" + new String(bys, 0, len));
        //给出反馈
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("数据已经收到".getBytes());
        //释放资源
        serverSocket.close();
    }
}


目录
相关文章
|
1天前
|
域名解析 存储 网络协议
TCP套接字【网络】
TCP套接字【网络】
18 10
|
7天前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
10 1
|
1月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
1月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
1月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
1月前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
1月前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。
|
28天前
|
网络协议
网络协议概览:HTTP、UDP、TCP与IP
理解这些基本的网络协议对于任何网络专业人员都是至关重要的,它们不仅是网络通信的基础,也是构建更复杂网络服务和应用的基石。网络技术的不断发展可能会带来新的协议和标准,但这些基本协议的核心概念和原理将继续是理解和创新网络技术的关键。
65 0
|
3月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
3月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
下一篇
无影云桌面