Java长连接的方式

在Java中,长连接是指客户端与服务器端建立一次连接后,可以多次进行通信,而不需要每次通信都重新建立连接。这种方式可以减少连接建立和断开的开销,提高通信效率。下面将介绍几种在Java中实现长连接的方式。

Socket实现长连接

使用Socket可以实现客户端与服务器端之间的长连接。客户端和服务器端建立连接后,可以通过输入输出流进行数据的传输。

// 客户端代码
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();

// 服务器端代码
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
 

HTTP长连接

在HTTP协议中,可以通过设置Connection为keep-alive来实现长连接。客户端和服务器端建立连接后,在一定的时间内保持连接,可以进行多次请求和响应。

// 设置Connection为keep-alive
connection.setRequestProperty("Connection", "keep-alive");
  • 1.
  • 2.
 

WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。客户端和服务器端可以保持长连接,并实现实时通信。

// 客户端代码
WebSocketClient client = new WebSocketClient(new URI("ws://localhost:8888"));
client.connect();

// 服务器端代码
WebSocketServer server = new WebSocketServer(8888);
server.start();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
 

NIO实现长连接

NIO(New I/O)是一种非阻塞I/O的方式,可以实现高效的长连接。通过Selector可以监听多个通道的事件,实现多路复用。

// 创建Selector
Selector selector = Selector.open();
// 注册通道到Selector
channel.register(selector, SelectionKey.OP_READ);
// 循环监听事件
while (true) {
    selector.select();
    Set<SelectionKey> selectedKeys = selector.selectedKeys();
    for (SelectionKey key : selectedKeys) {
        // 处理事件
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
 

关系图

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ LINE-ITEM : contains
    ORDER ||--|{ CUSTOMER : belongs to

状态图

 
connect()disconnect()DisconnectedConnected

以上是几种在Java中实现长连接的方式,选择合适的方式可以根据具体场景和需求来进行选择。长连接可以提高通信效率,减少连接的建立和断开开销,适用于需要频繁通信的场景。希望本文对您有所帮助。

posted @ 2025-02-13 11:30 甜菜波波 阅读(22) 评论(0) 推荐(0) 编辑
摘要: 链接:https://www.zhihu.com/question/445644612/answer/1742967478 好问题。这里的关键点在于:对同一行数据你可能同时需要多个历史版本的数据 以下讨论以MySQL的InnoDB引擎为例 在InnoDB中,有三种日志跟事务的ACID关系都很大: u 阅读全文
posted @ 2025-02-08 14:35 甜菜波波 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 一、单个Feign请求添加header 方法1.在@RequestMapping中添加 @FeignClient( url = "${orderServer_domain:http://order:8082}", value = "order-server", contextId = "OrderS 阅读全文
posted @ 2025-02-07 15:53 甜菜波波 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 零拷贝(Zero-Copy)技术的主要原理是通过减少或消除CPU在用户内存和内核内存之间的数据复制,从而减少中断和模式切换次数,提高I/O性能‌。具体来说,零拷贝技术通过以下几种方式实现:‌1 ‌虚拟内存‌:利用虚拟内存技术,将用户空间和内核空间的虚拟内存地址映射到同一块物理内存,避免数据在用户空间 阅读全文
posted @ 2025-02-05 16:56 甜菜波波 阅读(16) 评论(0) 推荐(0) 编辑
摘要: 背景 在项目开发中,使用 @Transactional 注解来管理事务非常方便,且优雅。但是也存在一个问题:长事务问题 很多被 @Transactional 标记的方法,实际上并不需要进行数据库操作,或者说,它们在执行的很长一段时间内都不会真正触发数据库访问。 举个例子,我们的业务逻辑可能如下: @ 阅读全文
posted @ 2025-01-20 08:56 甜菜波波 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 1、@JsonAutoDetect(作用在类上):自动检测 fieldVisibility:字段的可见级别;getterVisibility:getter方法的可见级别;setterVisibility:setter方法的可见级别。 ANY:任何级别的字段都可以自动识别 NONE:任何字段都不可以自 阅读全文
posted @ 2024-12-19 14:04 甜菜波波 阅读(110) 评论(0) 推荐(0) 编辑
摘要: @Configuration public class TtpfFeignConfig { @Bean public RequestInterceptor requestInterceptor(){//Feign同步请求头 return template -> { ServletRequestAtt 阅读全文
posted @ 2024-12-17 18:45 甜菜波波 阅读(24) 评论(0) 推荐(0) 编辑
摘要: @ExcelIgnoreUnannotated 注解用于在使用 Apache POI 或其他 Excel 处理库时,指示在导出 Excel时忽略没有被标注的字段。这意味着只有被特定注解(如 @ExcelProperty)标注的字段会被处理和导出。 作用简化导出过程:只导出需要的字段,避免不必要的数据 阅读全文
posted @ 2024-12-04 14:35 甜菜波波 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 解决序列化首字母小写问题: @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility= JsonAutoDetect.Visibility.NONE) 阅读全文
posted @ 2024-11-12 14:26 甜菜波波 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 在处理Excel报表时,我们经常会使用Java来读取和解析数据。然而,有时候在读取单元格数据时,可能会遇到java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell这样的错误。这个错误提示表明,你正在尝 阅读全文
posted @ 2024-11-01 15:11 甜菜波波 阅读(479) 评论(0) 推荐(1) 编辑
点击右上角即可分享
微信分享提示