java必学必会之网络编程

Java必学必会之网络编程攻略

一、网络基础概念

1.1 OSI七层模型

OSI七层模型是一种通用的网络协议分层模型,分为七层。自下而上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
Java通常使用的是传输层到应用层。

1.2 TCP/IP协议

TCP/IP协议比OSI七层模型更常用。分为四层:网络接口层、网络层、传输层、应用层。
Java提供了Socket和ServerSocket两个类用于支持TCP/IP协议的网络编程。

二、Socket编程

2.1 Socket的基础

Socket是Java提供的用于实现TCP/IP协议的基础类。
客户端通过Socket连接服务端创建Socket,服务端通过调用accept()方法接受客户端的Socket连接。

示例1:客户端代码

String hostName = "localhost";
int portNumber = 5555;

try (
    Socket echoSocket = new Socket(hostName, portNumber);
    PrintWriter out =
        new PrintWriter(echoSocket.getOutputStream(), true);
    BufferedReader in =
        new BufferedReader(
            new InputStreamReader(echoSocket.getInputStream()));
    BufferedReader stdIn =
        new BufferedReader(
            new InputStreamReader(System.in))
) {
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println("echo: " + in.readLine());
    }
} catch (UnknownHostException e) {
    System.err.println("Don't know about host " + hostName);
    System.exit(1);
} catch (IOException e) {
    System.err.println("Couldn't get I/O for the connection to " +
        hostName);
    System.exit(1);
}

示例2:服务端代码

int portNumber = 5555;

try (
    ServerSocket serverSocket =
        new ServerSocket(portNumber);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out =
        new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream()));
) {
    String inputLine, outputLine;
    // Initiate conversation with client
    KnockKnockProtocol kkp = new KnockKnockProtocol();
    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
        outputLine = kkp.processInput(inputLine);
        out.println(outputLine);
        if (outputLine.equals("Bye."))
            break;
    }
} catch (IOException e) {
    System.out.println("Exception caught when trying to listen on port "
        + portNumber + " or listening for a connection");
    System.out.println(e.getMessage());
}

2.2 Socket的高级应用

通过设置Socket的一系列参数,可以实现Socket编程的更高级应用,如服务端与多个客户端同时通信、非阻塞式通信等。

示例3:服务端同时与多个客户端通信的代码

public class MultiServer implements Runnable {
    private Socket socket;
    private ArrayList<Socket> socketList = new ArrayList<Socket>(); // 客户端List

    public MultiServer(Socket socket, ArrayList<Socket> socketList) {
        this.socket = socket;
        this.socketList = socketList;
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Message Received: " + inputLine);

                // 向其它客户端发送消息
                for (Socket eachSocket : socketList) {
                    if (eachSocket != socket) {
                        OutputStream outToClient = eachSocket.getOutputStream();
                        DataOutputStream out = new DataOutputStream(outToClient);
                        out.writeUTF(inputLine);
                    }
                }
            }
            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class MultiServerMain {
    public static void main(String[] args) throws IOException {
        int portNumber = 5555;
        ArrayList<Socket> socketList = new ArrayList<Socket>();

        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket socket = serverSocket.accept();
            socketList.add(socket);
            new Thread(new MultiServer(socket, socketList)).start();
        }
    }
}

三、总结

本篇攻略详细介绍了Java必学必会之网络编程,包括网络基础概念、Socket编程的基础和高级应用等内容,并给出了多个示例说明。掌握这些知识,可以帮助Java开发者更好地进行网络编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java必学必会之网络编程 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • logback.xml动态配置程序路径的操作

    当我们使用Logback作为日志框架时,配置文件logback.xml是必须的。而在实际生产环境中,我们可能需要动态修改日志输出路径,以满足不同的需求,这时候就需要对logback.xml进行动态配置。 根据环境变量动态配置路径 通过logback.xml中的配置,可以实现根据环境变量来动态配置日志输出路径。具体代码如下: <?xml version=…

    other 2023年6月25日
    00
  • 如何卸载wo99伴奏盒软件以减少软件占用的内存空间

    如何卸载wo99伴奏盒软件以减少软件占用的内存空间 wo99伴奏盒软件是一款占用内存空间较大的应用程序,如果您希望减少软件占用的内存空间,可以按照以下步骤卸载该软件。 步骤一:查找wo99伴奏盒软件 首先,您需要找到wo99伴奏盒软件的安装位置。通常情况下,软件会被安装在以下目录中: C:\\Program Files\\wo99伴奏盒 如果您将软件安装在其…

    other 2023年7月31日
    00
  • androidstudio实现页面跳转

    Android Studio实现页面跳转 在Android应用程序中,页面跳转是非常常见的操作。以下是Android Studio实现页面跳转的完整攻略。 步骤 以下是Android Studio实现页面跳转的步骤: 创建目标Activity。 在源Activity中创建Intent对象。 使用Intent对象传递数据(可选)。 调用startActivit…

    other 2023年5月6日
    00
  • 使用压缩的方式将Windows下的zip压缩包上传到Linux系统的方法解析

    使用压缩的方式将Windows下的zip压缩包上传到Linux系统的方法解析 在将Windows下的zip压缩包上传到Linux系统之前,我们需要确保已经安装了适当的工具和软件。以下是一个详细的攻略,包含了两个示例说明。 步骤一:安装必要的软件 在Linux系统上,我们需要安装unzip工具来解压缩zip文件。使用以下命令来安装unzip: sudo apt…

    other 2023年8月6日
    00
  • 图文详解MySQL中的主键与事务

    图文详解MySQL中的主键与事务 MySQL是当前应用最广泛的关系型数据库之一,它支持使用主键来确保数据的完整性,并且支持使用事务来保证数据的一致性和可靠性。下面我们将详细介绍MySQL中的主键和事务,附带两个示例说明。 主键 主键是一组列或单一的列,其值用于唯一标识表中的每一行数据。此外,它还可以用于确保表中的数据完整性,因为主键列的值不能为NULL。 创…

    other 2023年6月25日
    00
  • 使用Linux五年积累的一些经验技巧

    使用Linux五年积累的一些经验技巧攻略 1. 熟悉基本命令行操作 熟悉基本的命令行操作是使用Linux的关键。以下是一些常用的命令和技巧: ls:列出当前目录下的文件和文件夹。 cd:切换目录。 mkdir:创建新的文件夹。 rm:删除文件或文件夹。 cp:复制文件或文件夹。 mv:移动文件或文件夹。 grep:在文件中搜索指定的字符串。 chmod:修改…

    other 2023年8月15日
    00
  • 如何通过apt-get获得安装包的源码

    如何通过apt-get获得安装包的源码 在Linux系统中,使用APT (Advanced Package Tool)来安装软件包是常见的做法。通常我们只需要使用apt-get命令即可快速安装需要的软件包。然而在某些情况下,我们需要获取软件包的源码来自行编译或者进行其他自定义操作。下面将介绍如何通过apt-get命令获得安装包的源码。 步骤 首先,我们需要添…

    其他 2023年3月28日
    00
  • 详解Spring 中如何控制2个bean中的初始化顺序

    要控制 Spring 中两个 Bean 的初始化顺序,我们需要使用两种方式: 使用 @DependsOn 注解 @DependsOn 注解可以定义 Spring 容器加载 Bean 的顺序,让 Bean 的初始化顺序按照我们的预期进行。只需要在需要定义执行顺序的 Bean 上加上 @DependsOn 注解,并在注解中指定需要依赖的 Bean 的名称即可实现…

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