OkHttp3源码详解之-okhttp连接池复用机制(一),腾讯T2亲自讲解

  • Background threads are used to cleanup expired connections. There will be at most a single
  • thread running per connection pool. The thread pool executor permits the pool itself to be
  • garbage collected.
    /
    private static final Executor executor = new ThreadPoolExecutor(0 /
    corePoolSize /,
    Integer.MAX_VALUE /
    maximumPoolSize /, 60L / keepAliveTime */, TimeUnit.SECONDS,
    new SynchronousQueue(), Util.threadFactory(“OkHttp ConnectionPool”, true));

/** The maximum number of idle connections for each address. */
private final int maxIdleConnections;

private final Deque connections = new ArrayDeque<>();
final RouteDatabase routeDatabase = new RouteDatabase();
boolean cleanupRunning;

excutor : 线程池,用来检测闲置socket并对其进行清理。
connections : connection缓存池。Deque是一个双端列表,支持在头尾插入元素,这里用作LIFO(后进先出)堆栈,多用于缓存数据。
routeDatabase :用来记录连接失败router

2.1 缓存操作

ConnectionPool提供对Deque进行操作的方法分别为put、get、connectionBecameIdle、evictAll几个操作。分别对应放入连接、获取连接、移除连接、移除所有连接操作。

put操作

void put(RealConnection connection) {
assert (Thread.holdsLock(this));
if (!cleanupRunning) {
cleanupRunning = true;
executor.execute(cleanupRunnable);
}
connections.add(connection);
}

可以看到在新的connection 放进列表之前执行清理闲置连接的线程。

既然是复用,那么看下他获取连接的方式。

/** Returns a recycled connection to {@code address}, or null if no such connection exists. */
RealConnection get(Address address, StreamAllocation streamAllocation) {
assert (Thread.holdsLock(this));
for (RealConnection connection : connections) {
if (co

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中使用OkHttp3客户端连接到Flask-SocketIO服务器,您需要遵循以下步骤: 1. 在Java应用程序中,使用Maven或Gradle等构建工具将OkHttp3客户端库添加到您的项目中。例如,可以使用以下Maven依赖项: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> ``` 2. 在Java应用程序中,使用以下代码创建OkHttp3客户端实例并建立与Flask-SocketIO服务器的连接: ```java import okhttp3.*; import org.jetbrains.annotations.NotNull; import java.io.IOException; public class SocketIOClient { private final OkHttpClient client; private final Request request; public SocketIOClient() { this.client = new OkHttpClient.Builder().build(); this.request = new Request.Builder().url("http://localhost:5000/socket.io/").build(); } public void connect() { WebSocketListener listener = new WebSocketListener() { @Override public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { System.out.println("Connected to server: " + response.message()); } @Override public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { System.out.println("Received message: " + text); } @Override public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { System.out.println("Disconnected from server: " + reason); } @Override public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) { System.err.println("Error: " + t.getMessage()); } }; WebSocket ws = client.newWebSocket(request, listener); } } ``` 在上面的代码中,您需要将“http://localhost:5000”替换为您的Flask-SocketIO服务器的URL和端口。 3. 现在,您可以使用WebSocket实例发送和接收消息。例如,以下代码将向服务器发送“hello”消息并处理服务器发送的回复消息: ```java ws.send("hello"); ws.send("hello", new WebSocketListener() { @Override public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { System.out.println("Received reply: " + text); } }); ``` 在上面的代码中,服务器将使用“message”事件发送回复消息。您可以使用“onMessage”方法侦听此事件并处理消息。 希望这可以帮助您使用OkHttp3客户端连接到Flask-SocketIO服务器!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值