Spring Boot 搭建TCP Server

本示例首选介绍Java原生API实现BIO通信,然后进阶实现NIO通信,最后利用Netty实现NIO通信及Netty主要模块组件介绍。

Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。

BIO(Blocking I/O) 方案

BIO通信(一请求一应答)模型图如下

采用 BIO 通信模型 的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接。我们一般通过在while(true) 循环中服务端会调用 accept() 方法等待接收客户端的连接的方式监听请求,一旦接收到一个连接请求,就可以在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待当前连接的客户端的操作执行完成, 如果要让 BIO 通信模型 能够同时处理多个客户端请求,就必须使用多线程(主要原因是socket.accept()、socket.read()、socket.write() 涉及的三个主要函数都是同步阻塞的)

代码实现

BIO服务端

BIOServer.java

package com.easy.javaBio;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

@Slf4j
public class BIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(10002);
        while (true) {
            Socket client = server.accept(); //等待客户端的连接,如果没有获取连接  ,在此步一直等待
            new Thread(new ServerThread(client)).start(); //为每个客户端连接开启一个线程
        }
        //server.close();
    }
}

@Slf4j
class ServerThread extends Thread {

    private Socket client;

    public ServerThread(Socket client) {
        this.client = client;
    }

    @SneakyThrows
    @Override
    public void run() {
        log.info("客户端:"   client.getInetAddress().getLocalHost()   "已连接到服务器");
        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //读取客户端发送来的消息
        String mess = br.readLine();
        log.info("客户端:"   mess);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        bw.write(mess   "\n");
        bw.flush();
    }
}

BIO客户端

BIOClient.java

package com.easy.javaBio;

import lombok.extern.slf4j.Slf4j;

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

@Slf4j
public class BIOClient {

    public static void main(String[] args) throws IOException {
        Socket s = new Socket("0.0.0.0", 10002);

        InputStream input = s.getInputStream();
        OutputStream output = s.getOutputStream();

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(output));
        bw.write("客户端给服务端发消息测试\n");  //向服务器端发送一条消息
        bw.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(input));  //读取服务器返回的消息
        String mess = br.readLine();
        log.info("服务器:"   mess);
    }
}

运行示例

运行BIO服务端,然后再运行BIO客户端,观察控制台

BIOServer控制台输出:

Connected to the target VM, address: '127.0.0.1:64346', transport: 'socket'
17:29:52.519 [Thread-1] INFO com.easy.javaBio.ServerThread - 客户端:YHE6OR5UXQJ6D35/192.168.9.110已连接到服务器
17:29:52.523 [Thread-1] INFO com.easy.javaBio.ServerThread - 客户端:客户端给服务端发消息测试

BIOClient控制台输出:

Connected to the target VM, address: '127.0.0.1:64355', transport: 'socket'
17:29:52.527 [main] INFO com.easy.javaBio.BIOClient - 服务器:客户端给服务端发消息测试
Disconnected from the target VM, address: '127.0.0.1:64355', transport: 'socket'

这表示我们实现了一个最简单的BIO通信了

这种方式为每个客户端开启一个线程,高并发时消耗资源较多,容易浪费,甚至导致服务端崩溃,对性能造成负面影响,高并发下不推荐使用。

NIO(New I/O)方案

NIO通信模型图如下

NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。

NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

NIO服务端

NIOServer.java

package com.easy.javaBio;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.*;

@Slf4j
public class NIOServer {
    private InetAddress addr;
    private int port;
    private Selector selector;

    private static int BUFF_SIZE = 1024;

    public NIOServer(InetAddress addr, int port) throws IOException {
        this.addr = addr;
        this.port = port;
        startServer();
    }

    private void startServer() throws IOException {
        // 获得selector及通道(socketChannel)
        this.selector = Selector.open();
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(false);

        // 绑定地址及端口
        InetSocketAddress listenAddr = new InetSocketAddress(this.addr, this.port);
        serverChannel.socket().bind(listenAddr);
        serverChannel.register(this.selector, SelectionKey.OP_ACC
<think>我们正在搭建基于SQL Server数据库的Spring Boot项目。根据引用[1]和[2],我们可以通过以下步骤实现: 1. 添加SQL Server JDBC驱动依赖 2. 配置application.yaml(或application.properties)文件 3. 配置MyBatis(如果使用) 具体步骤如下: ### 步骤1:创建Spring Boot项目 使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目,选择所需的依赖(如Web、MyBatis等)。 ### 步骤2:添加SQL Server JDBC驱动 在pom.xml中添加Microsoft官方的SQL Server JDBC驱动依赖: ```xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> ``` ### 步骤3:配置数据库连接 在application.yaml文件中配置数据源: ```yaml spring: datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://localhost:1433;databaseName=your_database_name;encrypt=true;trustServerCertificate=true; username: your_username password: your_password ``` 注意:请将`your_database_name`、`your_username`和`your_password`替换为实际的数据库名称、用户名和密码。端口号如果是默认的1433,则无需修改,否则请调整。 ### 步骤4(可选):配置MyBatis 如果项目中使用了MyBatis,则需要在application.yaml中继续配置MyBatis: ```yaml mybatis: mapper-locations: classpath:mybatis/*.xml # 指定MyBatis的Mapper XML文件位置 type-aliases-package: com.example.model # 指定实体类所在的包 ``` ### 步骤5:创建实体类和Mapper 创建实体类(如User.java)和Mapper接口(如UserMapper.java),并在resources/mybatis目录下创建对应的Mapper XML文件。 ### 步骤6:运行测试 编写一个简单的Controller进行测试,确保能够正常访问数据库。 ### 常见问题 1. **连接问题**:确保SQL Server服务已启动,且允许远程连接(如果非本地)。 2. **加密问题**:如果出现加密相关错误,可以在连接字符串中添加`encrypt=true;trustServerCertificate=true;`。 3. **驱动问题**:确保依赖版本与SQL Server版本兼容。 §§相关问题§§ 1. 如何解决Spring Boot连接SQL Server时出现的SSL错误? 2. 如何在Spring Boot中使用JPA连接SQL Server? 3. Spring Boot中如何配置多数据源(SQL Server和其他数据库)?</think>### 搭建基于 SQL ServerSpring Boot 项目步骤 #### 1. **创建项目基础** 使用 [Spring Initializr](https://start.spring.io/) 生成项目: - **依赖选择**:`Spring Web`、`Spring Data JDBC` 或 `MyBatis`(根据 ORM 需求) - **项目类型**:Maven/Gradle - **语言**:Java #### 2. **添加 SQL Server 驱动依赖** 在 `pom.xml` 中添加官方 JDBC 驱动: ```xml <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.2.jre11</version> <!-- 版本需匹配JDK和SQL Server版本 --> <scope>runtime</scope> </dependency> ``` #### 3. **配置数据库连接** 在 `application.yaml` 中配置(推荐): ```yaml spring: datasource: url: jdbc:sqlserver://localhost:1433;databaseName=your_db;encrypt=true;trustServerCertificate=true; username: sa password: your_strong_password driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver ``` #### 4. **解决常见连接问题** - **SSL 加密问题**:在连接字符串末尾添加 `;encrypt=true;trustServerCertificate=true;` [^1] - **端口与实例名**:默认端口 `1433`,命名实例需指定 `//serverName\instanceName:port` - **防火墙**:确保 SQL Server 允许远程连接(通过 SQL Server 配置管理器) #### 5. **实体类与 Repository 示例** ```java // 实体类 @Data public class User { @Id private Long id; private String name; } // JPA Repository public interface UserRepository extends JpaRepository<User, Long> {} ``` #### 6. **MyBatis 额外配置(可选)** 若使用 MyBatis: ```yaml mybatis: mapper-locations: classpath:mybatis/*.xml # XML映射文件路径 type-aliases-package: com.example.model # 实体类包路径 ``` 在 `resources/mybatis/` 下创建映射文件 [^2] #### 7. **测试连接** 创建测试 Controller: ```java @RestController public class TestController { @Autowired private DataSource dataSource; @GetMapping("/test") public String test() throws SQLException { try (Connection conn = dataSource.getConnection()) { return "Connection successful! Database: " + conn.getMetaData().getDatabaseProductName(); } } } ``` ### 关键注意事项 1. **SQL Server 配置**: - 启用 TCP/IP 协议(通过 SQL Server 配置管理器) - 设置混合身份验证模式(SQL Server + Windows 认证) 2. **依赖兼容性**: - JDK 11+ 推荐使用 `mssql-jdbc` 10.x+ - JDK 8 使用 `mssql-jdbc` 8.x/9.x 3. **加密连接**: - 生产环境需配置正式证书而非 `trustServerCertificate=true` ### 验证流程 1. 启动 SQL Server 服务 2. 运行 Spring Boot 应用 3. 访问 `http://localhost:8080/test` 查看连接状态 4. 检查日志是否有 `HikariPool-1 - Starting...` 和 `Connection established` 信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值