Java网络编程之TCP通信完整代码示例

针对“Java网络编程之TCP通信完整代码示例”的完整攻略,我们可以分为以下几个部分来进行讲解:

  1. TCP通信基础
  2. Java TCP客户端和服务端代码编写
  3. 示例展示

接下来将分别说明。

1. TCP通信基础

TCP(Transmission Control Protocol)是一种面向连接的可靠的传输控制协议。其中面向连接是指进行数据传输前需要建立连接,传输完成后要断开连接;可靠的传输控制是指可以保证数据传输的可靠性,确保数据不会丢失和错乱。

TCP数据传输包含三个阶段:建立连接、数据传输和断开连接。在建立连接阶段,客户端与服务端进行握手,建立连接;在数据传输阶段,双方进行数据传输;在断开连接阶段,双方进行连接的断开。在这个过程中,双方都需要通过Socket(套接字)进行通信。

2. Java TCP客户端和服务端代码编写

针对Java TCP客户端和服务端代码的编写,我们可以分别编写两段代码来分别实现客户端和服务端的功能。

客户端代码

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

public class TCPClient {

    // 客户端主程序
    public static void main(String[] args) {
        try {
            // 与服务端建立连接
            Socket socket = new Socket("localhost", 8888);

            // 获取客户端输出流,向服务端发送数据
            OutputStream outputStream = socket.getOutputStream();
            String message = "Hello, TCP!";
            outputStream.write(message.getBytes());

            // 获取客户端输入流,接收服务端返回的数据
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int len = inputStream.read(buffer);
            String result = new String(buffer, 0, len);
            System.out.println("Client received message: " + result);

            // 关闭流和Socket连接
            outputStream.close();
            inputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

在客户端代码中,我们首先使用Socket对象进行与服务端的连接。然后通过输出流向服务端发送数据,接着通过输入流接收服务端返回的数据。最后关闭流和Socket连接。

服务端代码

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

public class TCPServer {

    // 服务端主程序
    public static void main(String[] args) {
        try {
            // 创建服务端Socket对象
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("Server started...");

            // 等待客户端连接
            Socket socket = serverSocket.accept();
            System.out.println("Client connected...");

            // 获取服务端输入流,接收客户端发送过来的数据
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int len = inputStream.read(buffer);
            String message = new String(buffer, 0, len);
            System.out.println("Server received message: " + message);

            // 获取服务端输出流,向客户端发送数据
            OutputStream outputStream = socket.getOutputStream();
            String result = "Welcome to join our chat group!";
            outputStream.write(result.getBytes());

            // 关闭流和Socket连接
            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

在服务端代码中,我们首先创建ServerSocket对象。然后通过这个对象等待客户端进行连接,并获取客户端输入流,接收客户端发送过来的数据。接着通过服务端输出流向客户端发送数据。最后关闭流和Socket连接。

3. 示例展示

我们可以使用两个示例来展示Java TCP客户端和服务端的通信过程。

示例1

在该示例中,我们启动服务端和客户端程序,客户端向服务端发送一条数据,服务端接收并打印出来,然后向客户端发送一条欢迎信息。

服务端代码:

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            System.out.println("Server started...");
            Socket s = ss.accept();
            System.out.println("Client connected...");
            InputStream in = s.getInputStream();
            OutputStream out = s.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String message = new String(buffer, 0, len);
            System.out.println("Server received message: " + message);
            out.write("Welcome to join our chat group!".getBytes());
            in.close();
            out.close();
            s.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

public class Client {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 8888);
            OutputStream out = s.getOutputStream();
            String message = "Hello, TCP!";
            out.write(message.getBytes());
            InputStream in = s.getInputStream();
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String result = new String(buffer, 0, len);
            System.out.println("Client received message: " + result);
            out.close();
            in.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

Server started...
Client connected...
Server received message: Hello, TCP!

示例2

在该示例中,我们在服务端程序中实现了一个倒计时。客户端向服务端发送一条数据,服务端开始倒计时,并在倒计时结束后向客户端发送一条信息。

服务端代码:

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            System.out.println("Server started...");
            Socket s = ss.accept();
            System.out.println("Client connected...");
            InputStream in = s.getInputStream();
            OutputStream out = s.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String message = new String(buffer, 0, len);
            System.out.println("Server received message: " + message);
            int time = Integer.parseInt(message);
            for (int i = time; i >= 0; i--) {
                Thread.sleep(1000);
                System.out.println(i);
            }
            out.write("Countdown finished!".getBytes());
            in.close();
            out.close();
            s.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

public class Client {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 8888);
            OutputStream out = s.getOutputStream();
            String message = "10";
            out.write(message.getBytes());
            InputStream in = s.getInputStream();
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String result = new String(buffer, 0, len);
            System.out.println("Client received message: " + result);
            out.close();
            in.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

Server started...
Client connected...
Server received message: 10
10
9
8
7
6
5
4
3
2
1
0

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java网络编程之TCP通信完整代码示例 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 一文带你了解SpringBoot中常用注解的原理和使用

    首先我们来介绍一下 Spring Boot 中常用的注解: @SpringBootApplication 这个注解是 Spring Boot 应用程序的入口点,同时也包含了 @EnableAutoConfiguration 和 @ComponentScan 注解,表示使用自动配置和组件扫描。 @RestController 这个注解表示一个类是 RESTfu…

    Java 2023年5月15日
    00
  • Mybatis plus多租户方案的实战踩坑记录

    Mybatis plus多租户方案的实战踩坑记录 什么是多租户 多租户,即多租户架构,是一种软件架构模式,指的是多个客户(租户)共用相同的软件应用系统、数据库和服务器等资源,并且每个租户数据是彼此独立,系统中一个租户的数据不能被其他租户访问。 Mybatis plus多租户 Mybatis plus是Mybatis的增强版,提供了多租户的支持,可以通过配置自…

    Java 2023年6月16日
    00
  • hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤

    上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘。这里我的看法是每个开发者圈友,都应该去参加一次 hackathon ~ 做 niche 软件正确的方法 这边先说结论,如图。我认为 做 niche 软件正确的方法 或 6 个步骤 是: 发现用户的问题或痛点 明确问…

    Java 2023年4月22日
    00
  • Java统计输入字符的英文字母、空格、数字和其它

    Java 统计输入字符的英文字母、空格、数字和其他字符可以使用字符流的方式读取输入,然后通过判断每个字符的 Unicode code point 值来区分字符类型,再统计出每种类型的字符个数。下面是具体实现的完整攻略。 实现步骤 创建一个字符缓冲区的读取器 BufferedReader,从标准输入读取输入等。 循环读取每个字符,直到读到输入流末尾。 对于每个…

    Java 2023年5月27日
    00
  • 关于java数组与字符串相互转换的问题

    关于Java数组与字符串相互转换的问题,以下是完整攻略: 将数组转换为字符串 使用Arrays类的toString()方法 可以使用Arrays类的toString()方法将数组转换为字符串。这个方法将数组转换为字符串,并且用逗号和空格分隔每个元素。 示例代码如下: int[] arr = {1, 2, 3, 4, 5}; String str = Arra…

    Java 2023年5月26日
    00
  • 分享Java性能调优的11个实用技巧

    首先,我们需要明确一下Java性能调优的目标:提高应用程序的处理能力、降低资源占用率、提高用户体验和稳定性。为达成此目标,我们可以使用以下11个实用技巧: 1.使用最新的JDK版本 尽可能地使用最新的JDK版本,因为它们通常具有更好的性能和更高效的垃圾回收器。 2.使用本地变量 使用本地变量可以减少对垃圾回收器的压力,因此可以提高性能。例如,可以将对象引用存…

    Java 2023年5月26日
    00
  • Java异常处理操作 Throwable、Exception、Error

    Java异常处理操作 在Java中,异常处理是至关重要的一部分。Java提供了一系列的异常处理机制,其中包括Throwable、Exception、Error等类,并且可以在代码块特定位置明确抛出特定类型的异常。在本文中,我们将详细介绍Java异常处理过程中的错误、异常以及如何处理它们的完整攻略。 Throwable类 Throwable是所有异常和错误类的…

    Java 2023年5月26日
    00
  • JavaEE Spring MyBatis如何一步一步实现数据库查询功能

    一、概述JavaEE 是一个企业级应用开发框架,Spring 是 JavaEE 中最常用的框架之一,MyBatis 是一款优秀的 ORM 框架,通过使用这三个框架,可以轻松实现一个 JavaEE 企业级应用。本文将以一个简单的文章阅读网站为例,介绍 JavaEE Spring MyBatis 如何一步一步实现数据库查询功能。 二、环境准备1. JDK 1.8…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部