从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (五)

Socket(套接字)

是网络编程中的一个重要概念,它是计算机网络中通信的基本操作单元。通过套接字,程序可以在网络上进行数据交流。简单来说,Socket是一个软件结构,完成三次握手它允许应用程序通过网络发送和接收数据,属于划分的五个层次的应用层。(不清楚的可以看专栏前面的文章中有些)

Socket的主要功能

  1. 通信:通过Socket,应用程序可以在不同计算机之间进行数据传输。
  2. 网络协议:Socket支持多种网络协议,包括TCP(传输控制协议)和UDP(用户数据报协议)
  3. 端口管理:Socket可以通过端口与网络上的其他应用程序进行区分,确保数据能够正确到达目标应用。这个要自己去定,一台电脑有65536个端口,可以完成65536×65536个连接。前后端分离开发就是通过端口来交流。
  4. 数据流管理:Socket可以处理流式数据,使得数据的发送和接收更加高效。上一篇有写Java的流处理

Java中的Socket实现

在Java中,Socket编程主要依赖于java.net包中的类。最常用的类有SocketServerSocket。下面是一个简单的示例,展示如何在Java中实现基于Socket的网络通信。

1. TCP Socket编程示例

服务器端

以下是一个简单的服务器的实现:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
    public static void main(String[] args) {
        final int DEFAULT_PORT = 7000; // 定义服务器监听的默认端口
        ServerSocket serverSocket = null; // 声明ServerSocket对象

        // 绑定端口
        try {
            serverSocket = new ServerSocket(DEFAULT_PORT); // 创建ServerSocket对象并绑定到指定端口
            System.out.println("服务器启动,监听端口 " + DEFAULT_PORT); // 输出服务器启动信息

            while (true) {
                // 等待客户端连接,返回一个Socket对象
                Socket socket = serverSocket.accept(); // 接受客户端连接
                System.out.println("客户端 " + socket.getPort() + " 连接成功"); // 输出客户端连接成功信息

                // 创建输入输出流
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream())); // 创建输入流
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())); // 创建输出流

                String msg = reader.readLine(); // 从输入流中读取一行数据
                if (msg != null) {
                    System.out.println("收到客户端 " + socket.getPort() + " 消息: " + msg); // 输出接收到的消息

                    writer.write("服务器收到消息: " + msg + "\n"); // 向客户端发送响应消息
                    writer.flush(); // 确保数据被发送出去
                }
            }

        } catch (IOException e) {
            e.printStackTrace(); // 捕获并打印IO异常
        } finally {
            if (serverSocket != null) {
                try {
                    serverSocket.close(); // 关闭ServerSocket
                } catch (IOException e) {
                    e.printStackTrace(); // 捕获并打印IO异常
                }
            }
        }
        System.out.println("Hello world!"); // 输出结束信息
    }
}



客户端

以下是一个简单的客户端的实现:

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args){
        final String DEFAULT_SERVER_HOST = "127.0.0.1";
        final int DEFAULT_SERVER_PORT = 7000;
        Socket sorket =  null;
        BufferedWriter writer = null;
        //创建socket
        try {
            //创建socket创建联系端点
            Socket socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
            //创建io流
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
          //等待数据
           BufferedReader cosoleRead =
                   new BufferedReader(new InputStreamReader(System.in));
           String input = cosoleRead.readLine();

            //发送消息给服务器
            writer.write(input + "\n");
            writer.flush();

            //读取服务器返回的消息
            String mag = reader.readLine();
            System.out.println(mag);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if (writer != null){
                try {
                    writer.close();
                    System.out.println("关闭客户端");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

代码说明

  1. ServerSocket:用于创建一个服务器端的Socket,监听特定的端口(在这里是7000)。
  2. Socket:一旦客户端请求连接,服务器端接受该请求,创建一个Socket对象与客户端进行通信。
  3. 输入输出流
    • 输入流:服务器通过BufferedReader读取客户端发送的信息。
    • 输出流:使用BufferedWriter向客户端发送响应。
  4. 连接管理:服务器在接收完客户端的消息后,关闭连接。服务器可以获取多个客服端发送消息。
BS架构(Browser/Server Architecture)
1. 定义

BS架构是指基于浏览器的网络架构模型,客户端通过浏览器访问服务器上的应用。服务器负责处理所有的业务逻辑和数据存储。

2. 特点
  • 无客户端安装:用户只需使用浏览器访问服务,无需安装额外的软件。
  • 集中管理:应用程序和数据集中在服务器端,便于管理和维护。
  • 跨平台:由于浏览器的广泛使用,BS架构几乎可以在所有操作系统上运行。
3. 优势
  • 易于部署:只需要更新服务器端,所有用户皆可立即获得最新版本。
  • 成本效益:减少了客户端的维护成本,简化了IT管理。
  • 易于访问:用户可以在任何设备上,只要有浏览器和网络连接即可访问。
4. 劣势
  • 性能限制:浏览器对性能的限制可能会影响用户体验,尤其是在复杂计算和图形处理上。
  • 安全性:面临更多的网络安全风险,因数据在网络中传输。
  • 功能限制:某些高级功能可能不易在浏览器中实现。
CS架构(Client/Server Architecture)
1. 定义

CS架构是指一种网络架构模型,其中客户端(Client)和服务器(Server)之间通过网络进行交互。客户端通常是一个桌面应用程序,直接与服务器进行数据交换。

2. 特点
  • 客户端应用程序:客户端需要安装专门的应用程序,通常是桌面软件。
  • 功能强大:由于可以利用客户端设备的资源,CS架构可以实现复杂的业务逻辑和界面。
  • 网络连接:客户端与服务器之间建立持久连接,通常采用TCP/IP协议。
  • 安全性:相对较高,数据和业务逻辑通常在服务器端处理,减少了客户端的安全隐患。
3. 优势
  • 性能:客户端可以进行复杂的计算和处理,减少服务器负担。
  • 用户体验:丰富的用户界面和交互能力。
  • 离线功能:部分客户端应用可以在没有网络连接的情况下运行。
4. 劣势
  • 维护成本:需要在每个客户端上安装和升级软件,维护成本较高。
  • 兼容性:可能存在不同操作系统和硬件配置之间的兼容性问题。
  • 网络依赖:依赖于网络的稳定性和速度。

总结

  • Socket是网络通信的基础,通过Socket可以实现客户端与服务器之间的数据交换。
  • 在Java中,通过SocketServerSocket类可以方便地实现基于TCP的网络通信。
  • 以上示例展示了基本的Socket使用,您可以根据需要扩展功能,例如处理多个客户端连接或添加异常处理逻辑。

下面是关于 BS 架构(Browser/Server,浏览器-服务器架构)和 CS 架构(Client/Server,客户机-服务器架构)的详细比较及解释。

特性CS架构BS架构
客户端需要安装专用应用无需安装,使用浏览器访问
资源利用可利用客户端资源依赖服务器资源
部署和维护复杂,需逐个更新客户端简单,集中更新服务器
跨平台兼容性可能存在兼容性问题跨平台,依赖浏览器
用户体验更丰富的界面和交互受限于浏览器的能力
安全性较高,但需保护客户端面临网络安全风险

CS架构适合对性能要求高、需要复杂计算的应用,而BS架构则更适合需要广泛访问、易于维护的应用。
这个只是一个简单的实现,之后会有个更加难的实现方法,运用bio实现聊天功能的。可以尝试一下客户端发送多条消息给服务器,下一篇会给出代码。
万丈高楼平地起。持续更新中~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值