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属性注入的两种方法

    SpringBoot提供了两种属性注入的方式:基于映射文件和基于注解。 基于映射文件 基于映射文件的方式,一般是将属性配置在application.properties或application.yml文件中,然后在程序中通过@Value注解进行注入。 1. application.properties方式 在application.properties文件中…

    Java 2023年5月15日
    00
  • 基于jsp+servlet实现的简单博客系统实例(附源码)

    这篇文章将会详细讲解如何通过使用JSP和Servlet来实现一个简单的博客系统。我们将会从搭建环境开始,到完成整个系统的构建。 环境搭建 工具准备 在开始之前,我们需要准备以下工具: Java SE Development Kit(JDK) Eclipse IDE for Java EE Developers Tomcat服务器 创建项目 打开Eclipse…

    Java 2023年6月15日
    00
  • Java通过正则表达式获取字符串中数字的方法示例

    当我们需要从字符串中提取数字时,可以使用Java正则表达式提取数字。以下是一些方法的示例说明。 示例 1:使用Pattern和Matcher类的方法 import java.util.regex.Matcher; import java.util.regex.Pattern; public class ExtractNumbers { public stat…

    Java 2023年5月27日
    00
  • Java中Singleton的3种实现方式详解

    Java中Singleton的3种实现方式详解 一、什么是Singleton? 在面向对象编程中,Singleton(单例)是一种创建模式,用于确保一个类只有一个实例,并提供了一个全局访问点。 在程序中,单例模式通常用于管理共享资源,例如数据库连接池、日志输出、配置信息等。 二、Singleton的实现方式 1. 饿汉式(Eager Initializati…

    Java 2023年5月18日
    00
  • Java KindEditor粘贴图片自动上传到服务器功能实现

    Java KindEditor是一款常用的富文本编辑器,在使用过程中,我们经常需要实现图片上传到服务器的功能。为了能够顺利实现这个功能,需要我们先了解一些相关的知识和步骤。 本文将详细介绍 Java KindEditor 粘贴图片自动上传到服务器的完整攻略,包括以下几个主要内容: 配置KindEditor 编写后端接口 解析图片数据并上传 前端页面示例说明 …

    Java 2023年6月15日
    00
  • php页面跳转session cookie丢失导致不能登录等问题的解决方法

    为了解决PHP页面跳转、Session和Cookie丢失导致不能登录等问题,我们可以采用以下方法: 解决Session丢失的方法 Session指的是在服务器端存储用户信息。当用户登录成功后,服务器会为该用户分配一个Session ID,并将该Session ID存储在Cookie中或者URL参数中。下面介绍两种解决Session丢失的方法: 1.设置ses…

    Java 2023年6月16日
    00
  • 详解SpringMVC的拦截器链实现及拦截器链配置

    详解SpringMVC的拦截器链实现及拦截器链配置 在SpringMVC中,拦截器是一个非常重要的组件,它可以帮助我们在请求到达控制器之前或之后执行一些操作。本文将详细介绍SpringMVC的拦截器链实现及拦截器链配置,并提供两个示例说明。 拦截器链实现 在SpringMVC中,拦截器链是由HandlerInterceptor接口实现的。拦截器链中的每个拦截…

    Java 2023年5月17日
    00
  • Java 构造方法的使用详解

    Java 构造方法的使用详解 什么是构造方法? 构造方法是一种特殊的方法,它在创建对象时被调用。在 Java 中,每个类都有至少一个构造方法,如果在类中没有定义构造方法,Java 会提供一个默认的构造方法。 使用构造方法的主要好处是可以确保对象在创建时就被初始化,并且避免了对象创建后状态不确定的情况。 构造方法的语法 构造方法的语法格式如下: [public…

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