老生常谈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日

相关文章

  • 这是我的战争前期前五天玩法介绍

    我的战争前期前五天玩法介绍 在《我的战争》游戏中,前期的五天非常关键,这里提供一些玩家可以使用的策略来存活和发展。 1. 初期资源的获取 在游戏的开始,资源非常有限,但是这并不意味着你不能快速发展。第一天,最重要的任务是保持活下来,建立一个可以保护你的基地。最好的方法是寻找资源点并获得最初的几个资源,例如金属和木材,而不是在第一天建造建筑。 2. 建立初期的…

    Java 2023年6月16日
    00
  • Java中的字符编码问题处理心得总结

    Java中的字符编码问题处理心得总结 在Java编程中,字符编码问题是一个常见的挑战。如果没有正确地处理字符编码,会出现许多问题,例如乱码、字符截断、字符丢失等。为了避免这些问题,我们需要按照以下步骤进行处理。 第一步:了解字符编码和字符集 在处理字符编码问题之前,我们需要了解字符编码和字符集的概念。 字符编码是指将字符转换为二进制形式的过程。在计算机机内部…

    Java 2023年5月31日
    00
  • Java8方法引用及构造方法引用原理实例解析

    Java8方法引用及构造方法引用原理实例解析 Java 8中引入了方法引用(Method Reference)的语法,可以根据Lambda表达式,快速地指向一个已有方法,从而简化编程。 方法引用使用“::”符号来定位某个方法,并用Lambda表达式将方法和函数式接口绑定在一起,从而由Java编译器自动完成Lambda表达式的类型推断。 方法引用的语法格式为:…

    Java 2023年5月26日
    00
  • Java中关于http请求获取FlexManager某设备分组监控点

    在Java中发送HTTP请求,可以使用Java内置的HttpURLConnection类或者第三方库如OkHttp、HttpClient等。以下是获取FlexManager某设备分组监控点的攻略。 准备工作 在发送HTTP请求前,需要导入相应的依赖包,例如使用OkHttp时,需要在pom.xml中添加以下依赖: <dependency> <…

    Java 2023年5月26日
    00
  • springboot如何关掉tomcat容器

    要关闭 Spring Boot 内嵌的 Tomcat 容器,我们可以通过修改 application.properties 或者 application.yml 文件来配置。下面是具体的步骤: 在 application.properties 文件中添加以下配置: server.shutdown=graceful 或在 application.yml 文件中…

    Java 2023年5月19日
    00
  • java实现的各种排序算法代码示例

    “Java实现的各种排序算法代码示例”这个话题,是介绍Java中常用的各种排序算法的实现方式。在这篇攻略中,将会依次介绍常用排序算法的实现思路,结合Java语言的特点,详细讲解每种算法的代码实现。 什么是排序算法 排序算法是计算机科学中的一种重要算法,它指的是将一组序列按照顺序重新排列的过程。对于程序员来说,熟练掌握各种排序算法,不仅可以提高代码的执行效率,…

    Java 2023年5月18日
    00
  • Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

    针对“Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解”,我们来进行一次完整的攻略。 1. 动态SQL的概述 在Mybatis中,动态SQL用于将不同的SQL语句组合在一起,以便在运行时决定使用哪一个SQL语句。Mybatis使用了一些标记来支持动态SQL,包括if、choose、where、set、tr…

    Java 2023年5月20日
    00
  • Java编程实现基于用户的协同过滤推荐算法代码示例

    首先来讲解一下“Java编程实现基于用户的协同过滤推荐算法”的完整攻略。 1.什么是协同过滤推荐算法 协同过滤推荐算法是一种根据用户的历史行为来推荐相似物品的算法。它与传统的推荐算法相比,具有更高的精度和个性化的特点。协同过滤推荐算法分为两种类型,即基于用户的协同过滤和基于物品的协同过滤。 2.基于用户的协同过滤推荐算法实现 基于用户的协同过滤推荐算法实现分…

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