老生常谈Java 网络编程 —— Socket 详解

视频教程:“老生常谈Java 网络编程 —— Socket 详解”攻略

欢迎学习本教程,本教程将为您详细阐述Java中网络编程的Socket模块的使用方法及相关细节。以下是您需要学习的知识点:

什么是Socket?

Socket,或称“套接字”,是应用层与传输层之间的一个中间层。Socket层为应用程序提供了一组可以在网络上进行通信的API,包括以下内容:

  • IP地址;
  • 传输协议(TCP/UDP);
  • 端口号。

在Java中,Socket由java.net包提供。

如何使用Socket?

在Java中,使用Socket建立起网络连接,读取和发送数据的过程可以如下图所示:

/**
* 客户端代码示例
*/
public class Client {
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("localhost", 9000);
        // 发送请求数据流
        OutputStream output = client.getOutputStream();
        String requestData = "Hello, Server";
        output.write(requestData.getBytes("UTF-8"));
        // 接收响应数据流
        InputStream inputStream = client.getInputStream();
        byte[] responseByte = new byte[1024];
        int length = inputStream.read(responseByte);
        String responseData = new String(responseByte, 0, length, "UTF-8");
        // 关闭流和Socket
        inputStream.close();
        output.close();
        client.close();
    }
}

/**
* 服务器端代码示例
*/
public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9000);
        while (true) {
            Socket client = server.accept();
            // 接收请求数据流
            InputStream inputStream = client.getInputStream();
            byte[] requestByte = new byte[1024];
            int length = inputStream.read(requestByte);
            String requestText = new String(requestByte, 0, length, "UTF-8");
            System.out.println("Server request:" + requestText);
            // 响应请求数据流
            OutputStream output = client.getOutputStream();
            String responseText = "Hello, Client";
            output.write(responseText.getBytes("UTF-8"));
            // 关闭流和Socket
            inputStream.close();
            output.close();
            client.close();
        }
    }
}

代码分为服务器端和客户端两部分。首先是服务端的代码,它在循环中持续接受客户端的请求,并返回响应数据。客户端程序在建立Socket连接后向服务器发送数据,并等待服务器的响应。

如何防止Socket的数据损坏?

  • 尽量在Socket通信中使用TCP协议;
  • 发送数据时需要进行流量控制,避免发送数据过快;
  • 接收数据时使用缓存,避免数据接收过快和数据的丢失。

其中,TCP协议的好处是可以保证数据的完整性和可靠性,实现方案可以使用数据校验的方式。

示例

示例1:基于Socket的客户端文件传输

客户端使用Socket向服务端传送文件,服务端将文件转发至指定客户端。代码如下:

/**
* 客户端代码
*/
public class Client {
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("localhost", 9000);
        OutputStream output = client.getOutputStream();
        String filePath = "/Users/Test/Desktop/demo.txt";
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);
        byte[] fileByte = new byte[1024];
        int length;
        while ((length = fis.read(fileByte)) > 0) {
            output.write(fileByte, 0, length);
            output.flush();
        }
        fis.close();
        output.close();
        client.close();
    }
}

/**
* 服务端代码
*/
public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9000);
        while (true) {
            Socket client = server.accept();
            InputStream inputStream = client.getInputStream();
            byte[] fileByte = new byte[1024];
            int length;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            while ((length = inputStream.read(fileByte)) > 0) {
                baos.write(fileByte, 0, length);
                baos.flush();
            }
            baos.close();
            inputStream.close();
            FileOutputStream fos = new FileOutputStream("fileOut.txt");
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
            client.close();
        }
    }
}

示例2:基于Socket的简易聊天程序

服务端运行于某计算机的端口上,客户端使用Telnet程序连接。所有传输数据都采用文本形式。

/**
* 服务端代码
*/
public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(9000);
        while (true) {
            Socket client = server.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
                if ("bye".equals(inputLine)) {
                    break;
                }
            }
            in.close();
            out.close();
            client.close();
        }
    }
}

/**
* 客户端代码
*/
public class Client {
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("localhost", 9000);
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(client.getOutputStream(), true);
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            out.println(inputLine);
            if ("bye".equals(inputLine)) {
                break;
            }
        }
        in.close();
        out.close();
        client.close();
    }
}

总结

本节课程对Java中Socket模块的使用做了简单介绍,讲解了Socket的概念、如何使用Socket、如何防止Socket的数据损坏,以及两个相关示例。希望通过此教程,您可以更好地理解Java网络编程中Socket模块相关的知识点,掌握Socket编程的基本技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:老生常谈Java 网络编程 —— Socket 详解 - Python技术站

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

相关文章

  • Spring Security前后分离校验token的实现方法

    我会详细讲解“Spring Security前后分离校验token的实现方法”的完整攻略。这里将分为以下几个步骤: 获得token 将token保存到请求头中 在后端进行token校验 返回结果给前端 下面我们具体来看一下每一步的实现方法。 1. 获得token 首先,我们需要在前端登录成功之后,获得token。我们可以通过发送登录请求来获取token,例如…

    Java 2023年5月20日
    00
  • 通过代码实例了解SpringBoot启动原理

    通过代码实例了解Spring Boot启动原理 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。在本文中,我们将通过代码实例了解Spring Boot的启动原理。 Spring Boot启动原理 Spring Boot的启动原理可以概括为以下几个步骤: 加载Spring Boot的核心配置文件。 根据配置文件中的信息,创建Sprin…

    Java 2023年5月15日
    00
  • java Springboot实现多文件上传功能

    下面是Java SpringBoot实现多文件上传功能的完整攻略: 1. 搭建SpringBoot工程 首先我们需要通过Maven或Gradle来搭建一个SpringBoot工程,这里以Maven为例: <dependency> <groupId>org.springframework.boot</groupId> &lt…

    Java 2023年5月19日
    00
  • 详解Spring Boot中如何自定义SpringMVC配置

    详解Spring Boot中如何自定义Spring MVC配置 Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在Spring Boot中,Spring MVC是默认的Web框架。本文将介绍如何自定义Spring MVC配置,包括添加拦截器、自定义消息转换器、自定义异常处理器等,并提供两个示例。 自定义Spring MVC配…

    Java 2023年5月15日
    00
  • 详解 maven的pom.xml用解决版本问题

    下面就是关于“详解 Maven 的 pom.xml 用 解决版本问题”的完整攻略。 概述 当在Maven项目中出现依赖jar包与自己项目中的相关版本不兼容时,可以通过在pom.xml文件中使用<exclusion>标签来排除掉该依赖中不兼容的包,保证项目的正常运行。 详解步骤 接下来详细介绍如何使用<exclusion>标签解决版本问…

    Java 2023年6月2日
    00
  • maven 打包时间戳问题

    Maven 是一个流行的 Java 项目构建工具,它提供了各种功能,包括依赖管理、编译、测试、打包等。在实际项目中,我们经常需要对代码进行打包以便于部署和发布。其中,在打包过程中加入时间戳可以帮助我们更好地记录版本信息,方便项目的管理和追踪。然而,在 Maven 打包时间戳问题中也存在一些坑点,需要注意。 配置 pom.xml 文件 我们可以在项目的 pom…

    Java 2023年6月1日
    00
  • java正则表达式实现提取需要的字符并放入数组【ArrayList数组去重复功能】

    针对这个问题,我将分成两个部分进行回答。 第一部分:Java正则表达式实现提取需要的字符并放入数组 基本概念 正则表达式是用于描述字符串模式的一个表达式。可以根据正则表达式来匹配、查找、替换符合特定模式的文本。在 Java 中,正则表达式需要使用java.util.regex包中的类来实现。 正则表达式语法 下面是常用的正则表达式语法: . 匹配任何一个字符…

    Java 2023年5月26日
    00
  • Java使用synchronized实现互斥锁功能示例

    实现互斥锁是多线程编程中常见的问题,Java中提供了synchronized关键字来实现互斥锁功能。 1. synchronized基本用法 1.1 使用在方法上 在方法上使用synchronized关键字,可以实现对当前对象的方法加锁,使得同一时间只能有一个线程访问该方法。 public class SynchronizedExample { public…

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