Java实现TCP和UDP协议详解

 更新时间:2023年07月19日 09:57:42   作者:硬件人某某某  
这篇文章主要介绍了Java实现TCP和UDP协议详解,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议,它们都用于在网络上传输数据,但是它们之间有很多不同之处,需要的朋友可以参考下

TCP和UDP

在计算机网络中,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议。

它们都用于在网络上传输数据,但是它们之间有很多不同之处。

本文将介绍TCP和UDP的基本概念,以及在Java中如何实现TCP和UDP协议。

什么是TCP和UDP?

TCP和UDP都是传输层协议,用于在网络上传输数据。它们都是在IP协议之上构建的协议,因此它们都需要IP地址和端口号来标识网络中的设备和应用程序。

TCP

TCP是一种面向连接的协议,它提供了可靠的数据传输。在TCP连接中,数据被分割成多个数据包,并通过网络传输。每个数据包都有一个序号和确认号,用于检测数据包是否丢失或损坏。如果一个数据包丢失或损坏,TCP会重新发送该数据包,直到接收方确认收到为止。TCP还提供了流控制和拥塞控制机制,以确保网络不会过载或崩溃。

UDP

UDP是一种无连接的协议,它提供了不可靠的数据传输。在UDP中,数据被分割成多个数据包,并通过网络传输。每个数据包都有一个源端口和目标端口,但没有序号和确认号。如果一个数据包丢失或损坏,UDP不会重新发送该数据包。UDP不提供流控制和拥塞控制机制,因此在网络拥塞或负载过高的情况下,可能会导致数据包丢失或延迟。

Java中的TCP和UDP

在Java中,可以使用Socket类和DatagramSocket类来实现TCP和UDP协议。Socket类用于TCP协议,DatagramSocket类用于UDP协议。以下是TCP和UDP协议在Java中的实现示例。

TCP

以下是一个使用Socket类实现TCP协议的示例。在这个示例中,我们创建了一个服务器和一个客户端。客户端向服务器发送消息,服务器接收并响应消息。

服务器端代码

import java.io.*;
import java.net.*;
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("Server started.");
        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("Connected: " + clientSocket);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            String inputLine, outputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received message: " + inputLine);
                outputLine = "Server: " + inputLine;
                out.println(outputLine);
                if (outputLine.equals("Bye."))
                    break;
            }
            clientSocket.close();
            System.out.println("Client disconnected.");
        }
    }
}

客户端代码

import java.io.*;
import java.net.*;
public class TCPClient {
    public static void main(String[] args) throws IOException {
        String serverHostname = "localhost";
        int serverPort = 9999;
        Socket socket = new Socket(serverHostname, serverPort);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("Sent message: " + userInput);
            String receivedMessage = in.readLine();
            System.out.println("Received message: " + receivedMessage);
            if (receivedMessage.equals("Bye."))
                break;
        }
        socket.close();
        System.out.println("Connection closed.");
    }
}

在这个示例中,我们创建了一个ServerSocket对象,它绑定到9999端口,然后等待客户端连接。当客户端连接后,服务器会创建一个Socket对象,并使用这个Socket对象的输入流和输出流来和客户端通信。当服务器从客户端接收到消息后,它会将消息添加前缀“Server: ”并返回给客户端。

客户端首先连接到服务器,然后从标准输入中读取输入,并将它发送给服务器。客户端还从服务器接收响应,并将其打印到控制台上。

UDP

以下是一个使用DatagramSocket类实现UDP协议的示例。在这个示例中,我们创建了一个服务器和一个客户端。客户端向服务器发送消息,服务器接收并响应消息。

服务器端代码

import java.io.*;
import java.net.*;
public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket serverSocket = new DatagramSocket(9999);
        System.out.println("Server started.");
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        while (true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received message: " + message);
            InetAddress IPAddress = receivePacket.getAddress();
            int port = receivePacket.getPort();
            String responseMessage = "Server: " + message;
            sendData = responseMessage.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            serverSocket.send(sendPacket);
            if (responseMessage.equals("Server: Bye.")) {
                System.out.println("Client disconnected.");
                break;
            }
        }
        serverSocket.close();
    }
}

客户端代码

import java.io.*;
import java.net.*;
public class UDPClient {
    public static void main(String[] args) throws IOException {
        String serverHostname = "localhost";
        int serverPort = 9999;
        DatagramSocket clientSocket = new DatagramSocket();
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        InetAddress IPAddress = InetAddress.getByName(serverHostname);
        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];
        String userInput;
        while ((userInput = inFromUser.readLine()) != null) {
            sendData = userInput.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);
            clientSocket.send(sendPacket);
            System.out.println("Sent message: " + userInput);
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
            String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received message: " + receivedMessage);
            if (receivedMessage.equals("Server: Bye.")) {
                System.out.println("Connection closed.");
                break;
            }
        }
        clientSocket.close();
    }
}

在这个示例中,我们创建了一个DatagramSocket对象,并绑定到9999端口。服务器从客户端接收消息,并将消息添加前缀“Server: ”并返回给客户端。

客户端创建一个DatagramSocket对象,并向服务器发送消息。客户端还从服务器接收响应,并将其打印到控制台上。

总结

TCP和UDP是计算机网络中最常用的传输层协议。TCP是一种面向连接的协议,提供可靠的数据传输。UDP是一种无连接的协议,提供不可靠的数据传输。

在Java中,可以使用Socket类和DatagramSocket类来实现TCP和UDP协议。TCP协议使用Socket类,UDP协议使用DatagramSocket类。在代码编写过程中,需要注意正确处理异常和及时关闭Socket和DatagramSocket对象,以避免资源泄露和数据丢失等问题。

到此这篇关于Java实现TCP和UDP协议详解的文章就介绍到这了,更多相关Java实现TCP和UDP内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现堆排序和图解

    Java实现堆排序和图解

    如果将堆理解为二叉树,那么树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字,堆排序的时间复杂度为O(N*logN),这里我们就来详解堆排序算法原理及Java版的代码实现
    2021-07-07
  • java实现的连接oracle/mysql数据库功能简单示例【附oracle+mysql数据库驱动包】

    java实现的连接oracle/mysql数据库功能简单示例【附oracle+mysql数据库驱动包】

    这篇文章主要介绍了java实现的连接oracle/mysql数据库功能,结合实例形式分析了java基于jdbc连接Oracle与mysql的相关操作技巧,并附带完整实例代码与oracle+mysql数据库驱动包供读者下载参考,需要的朋友可以参考下
    2017-10-10
  • Springcloud实现服务多版本控制的示例代码

    Springcloud实现服务多版本控制的示例代码

    这篇文章主要介绍了Springcloud实现服务多版本控制的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    这篇文章主要给大家介绍了关于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Java基础之删除文本文件中特定行的内容

    Java基础之删除文本文件中特定行的内容

    这篇文章主要介绍了Java基础之删除文本文件中特定行的内容,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 如何解决@NotBlank不生效的问题

    如何解决@NotBlank不生效的问题

    这篇文章主要介绍了如何解决@NotBlank不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JAVA解决在@autowired,@Resource注入为null的情况

    JAVA解决在@autowired,@Resource注入为null的情况

    这篇文章主要介绍了JAVA解决在@autowired,@Resource注入为null的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java常量字符串过长报错的解决办法以及原因分析

    java常量字符串过长报错的解决办法以及原因分析

    在IDEA中字符串长度超过65535,进行打印,IDEA会提示java:常量字符串过长,这篇文章主要给大家介绍了关于java常量字符串过长报错的解决办法以及原因分析,需要的朋友可以参考下
    2023-01-01
  • Java中的几种读取properties配置文件的方式

    Java中的几种读取properties配置文件的方式

    这篇文章主要介绍了Java中的几种读取properties配置文件的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot+Thymeleaf+ECharts实现大数据可视化(基础篇)

    SpringBoot+Thymeleaf+ECharts实现大数据可视化(基础篇)

    本文主要介绍了SpringBoot+Thymeleaf+ECharts实现大数据可视化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06

最新评论