老生常谈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中使用编码方式动态配置Bean详解

    下面我将详细讲解如何在Spring中使用编码方式动态配置Bean的攻略。 1. 概述 Spring框架的核心是IOC和AOP,其中IOC就是借助容器来实现对象的自动管理,而AOP则是通过切面编程实现对对象的增强。通常情况下,Spring通过XML或注解的方式配置Bean,但是在一些特殊场景下,需要动态的创建和管理Bean,这些场景比如: 根据配置文件动态生成…

    Java 2023年5月20日
    00
  • MyEclipse代码提示设置包括html和jsp的代码

    MyEclipse是一款常用的Java开发工具,具有强大的代码提示和自动补全功能,对于提高编程效率十分有帮助。而要完整地设置代码提示,包括HTML和JSP的代码,也并不是一件困难的事情。下面我将为大家介绍详细的设置步骤,包括两个实际的示例。 设置HTML代码提示 在MyEclipse中,设置HTML代码提示需要按照以下步骤进行: 打开MyEclipse软件,…

    Java 2023年6月15日
    00
  • Java中BM(Boyer-Moore)算法的图解与实现

    Java中BM(Boyer-Moore)算法的图解与实现 前言 本文主要介绍在Java中实现BM算法。BM算法是一种高效的模式匹配算法,其核心思想是,对于模式串的每个字符,在匹配串中寻找该字符时,优先从模式串的尾部开始匹配,以减少匹配步骤。本文将详细介绍BM算法的流程,并提供两个示例以帮助读者更好地理解该算法。 算法流程 计算字符偏移量表 字符集假设有m个字…

    Java 2023年5月19日
    00
  • java web实现自动登录功能

    实现自动登录功能的主要思路是利用浏览器的cookie机制。当用户登录成功时,服务器会将用户信息保存为cookie,并设置其过期时间。每次用户访问网站时,浏览器会自动将保存的cookie发送到服务器,从而实现免登录访问。 下面是实现自动登录功能的步骤: 1. 编写登录接口 首先需要编写登录接口,当用户点击登录按钮后,将用户名和密码发送到服务器进行验证。验证通过…

    Java 2023年6月16日
    00
  • 滴滴二面之Kafka如何读写副本消息的

    滴滴二面之Kafka如何读写副本消息的攻略 Kafka 是一种分布式消息系统,消息被分为多个分区存储在多个 broker 中。副本是为了在发生故障时提供消息持久性和可靠性所增加的。在 Kafka 中,每个分区都会有多个副本,其中一个作为主副本,其他副本作为从副本,主副本负责进行读写操作,而从副本只需要对主副本的写操作进行复制,从而保证数据的可靠性。 读副本消…

    Java 2023年5月20日
    00
  • java微信支付接入流程详解

    Java微信支付接入流程详解 本文将详细介绍Java微信支付接入的流程,帮助开发者在自己的网站中使用微信支付。 1. 注册微信支付商户号 在使用微信支付之前,需要先注册一个微信支付商户号。具体步骤如下: 在微信商户平台(https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F)注册一…

    Java 2023年5月26日
    00
  • Java数组实例练习题整理

    首先需要明确的是,本篇攻略旨在帮助初学者提升对于Java数组的理解和应用,因此我们会针对数组的定义、初始化、常用操作和实例练习题等方面进行讲解。 数组定义和初始化 数组是一种能够存储多个相同类型数据的结构,它能够提供快速的访问和遍历方式。在Java中,数组的定义方式为 数组类型[] 数组名 或者 数组类型 数组名[],其中 数组类型 表示数组中存储的数据类型…

    Java 2023年5月26日
    00
  • jsp实现局部刷新页面、异步加载页面的方法

    让我来为您详细讲解一下“JSP实现局部刷新页面、异步加载页面的方法”的完整攻略。 前言 JSP(Java Server Pages)是一种基于Java技术的Web开发技术,它允许开发人员在HTML标签中包含Java代码,并通过编译器将其转换为Java Servlet。JSP通常与MVC(Model-View-Controller)设计模式一起使用,它允许开发…

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