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日

相关文章

  • 深入了解Java设计模式之职责链模式

    深入了解Java设计模式之职责链模式 职责链模式是一种行为型设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者处理该请求。职责链模式常用于请求的处理流程较为复杂,有多个处理器时的情况。 定义 职责链模式为请求创建了一个接受者对象的链,给予请求的类型,对请求的发送者和接收者进行解耦。职责链模式将请求的发送者和接收者分离开来,只要在链上得到处理,就…

    Java 2023年5月20日
    00
  • Java基于深度优先遍历的随机迷宫生成算法

    Java基于深度优先遍历的随机迷宫生成算法攻略 算法思路 这里介绍的是基于深度优先遍历(DFS)的随机迷宫生成算法。该算法的基本思路是,从起点开始,每次选择一个相邻且未被访问过的节点作为下一个遍历的节点,直到到达终点,期间可以任意回溯。在此基础上加入了随机化操作,即在选择相邻节点时随机打乱遍历顺序,以此生成”随机”的迷宫。 实现步骤 首先,我们需要定义一个M…

    Java 2023年5月19日
    00
  • 详解Spring全局异常处理的三种方式

    我会详细讲解“详解Spring全局异常处理的三种方式”的完整攻略,并给出两个示例说明。 1. 为什么需要全局异常处理 Spring应用程序在运行过程中难免会遇到一些异常,如异常的输入、网络连接中断等。这些异常无法避免,但我们需要对这些异常进行合理的处理以便程序更健壮。而全局异常处理正是为此而设。 全局异常处理是指在应用程序中捕获所有未被捕获的异常,并尝试对它…

    Java 2023年5月27日
    00
  • Java利用jenkins做项目的自动化部署

    下面是关于“Java利用Jenkins做项目的自动化部署”的完整攻略: 简介 Jenkins是一个开源的自动化部署工具,用于构建、测试、发布软件项目。Java开发人员可以使用Jenkins实现自己的自动化部署。Java利用Jenkins做项目的自动化部署,主要分为两个步骤: 安装Jenkins 配置Jenkins、部署项目 接下来将针对这两个方面分别详细介绍…

    Java 2023年5月19日
    00
  • Ajax通过XML异步提交的方法实现从数据库获取省份和城市信息实现二级联动(xml方法)

    创建数据库和数据表 首先,需要先创建一个数据库,可以取名为demo,然后在这个数据库中创建一张名为province的数据表,并插入一些数据。表结构如下: CREATE TABLE IF NOT EXISTS `province` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘省份ID’, `…

    Java 2023年6月15日
    00
  • SpringMVC 向jsp页面传递数据库读取到的值方法

    首先需要说明的是,SpringMVC向JSP页面传递数据库读取到的值的方法有很多种,这里介绍一种基本的方法。 控制层(Controller) 在控制层中我们需要注入一个由Service层封装好的Map对象,并将这个Map对象存入ModelAndView中,然后返回给View层(即JSP页面)。 示例: @Controller public class Use…

    Java 2023年5月26日
    00
  • 详解用maven将dubbo工程打成jar包运行

    下面是详解用 Maven 将 Dubbo 工程打成 Jar 包运行的完整攻略。 1. 确认dubbo工程已经创建并可正常运行 首先,需要确认 Dubbo 工程已经创建并且能够正常运行。其中,建议使用 Java 8 或更高版本。 2. 在 pom.xml 文 件 中 增 加 打 包 插 件 配 置 在工程的 pom.xml 文件中,需要增加打包插件配置,以生成…

    Java 2023年5月20日
    00
  • ajax提交session超时跳转页面使用全局的方法来处理

    下面我将详细讲解“ajax提交session超时跳转页面使用全局的方法来处理”的攻略: 1. 为什么需要处理session超时问题? 在网站应用中,为了提高用户体验和保护用户数据安全,通常需要对用户进行登录鉴权,登录成功后保留用户信息,而服务器端的Session就是一个将用户信息和服务器端的数据进行关联的机制。但是Session都有一个生命周期,当这个生命周…

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