SOCKS 代理 和 HTTP 代理 的区别
SOCKS 代理 和 HTTP 代理 都是代理服务器,它们充当客户端和目标服务器之间的中介,但它们的工作方式和应用场景有所不同。
1. SOCKS 代理:
- 工作原理: SOCKS 代理是一种更底层的代理,它只处理网络连接,并不解析 HTTP 请求。它就像一个“隧道”,将客户端的网络请求转发到目标服务器。
- 支持协议: SOCKS 代理主要支持 TCP 和 UDP 协议,可以用于各种网络应用,例如 HTTP、HTTPS、FTP、SSH 等。
- 透明性: SOCKS 代理对客户端和目标服务器是透明的,这意味着目标服务器不知道客户端的真实 IP 地址。
- 安全性: SOCKS 代理本身不提供任何加密或身份验证,因此安全性依赖于底层网络连接的安全性。
代理地址示例:socks://proxy.example.com:1080
2. HTTP 代理:
- 工作原理: HTTP 代理专门处理 HTTP 请求,它会解析 HTTP 请求并根据需要修改请求头和请求内容,然后将请求转发到目标服务器。
- 支持协议: HTTP 代理只支持 HTTP 协议,只能用于处理 HTTP 请求。
- 非透明性: HTTP 代理对目标服务器是不透明的,目标服务器可以获取客户端的真实 IP 地址。
- 安全性: HTTP 代理通常提供一些安全功能,例如身份验证、加密等,以提高安全性。
代理地址示例:http://proxy.example.com:8080
两者的区别总结:
特性 | SOCKS 代理 | HTTP 代理 |
---|---|---|
协议支持 | TCP/UDP | HTTP |
工作原理 | 网络连接隧道 | HTTP 请求转发 |
透明性 | 透明 | 非透明 |
安全性 | 依赖底层网络连接的安全性 | 通常提供身份验证和加密 |
应用场景 | 各种网络应用,例如 HTTP、HTTPS、FTP、SSH 等 | 主要用于 HTTP 请求 |
1. HTTP 代理
协议: HTTP 协议
解析出的地址和端口: 通常是代理服务器的 IP 地址和端口号。
连接方式: OkHttp 使用 HTTP 协议向代理服务器发送请求,请求中包含目标服务器的地址和端口号。代理服务器收到请求后,会将请求转发给目标服务器,并接收目标服务器的响应,再将响应转发给客户端。
举例:
假设您要访问网站 www.example.com,使用 http://proxy.example.com:8080 作为 HTTP 代理服务器。
Proxy.Type.HTTP: OkHttp 会解析出 proxy.example.com 和 8080。
- 连接流程:
OkHttp 向 proxy.example.com:8080 发送一个 HTTP 请求,请求中包含目标服务器 www.example.com 的地址和端口号。
代理服务器收到请求后,会将请求转发给 www.example.com。
www.example.com 返回响应给代理服务器。
代理服务器将响应转发给 OkHttp。
OkHttp 收到响应并处理。
2. SOCKS 代理
协议: SOCKS 协议 (通常是 SOCKS4 或 SOCKS5)
解析出的地址和端口: 通常是代理服务器的 IP 地址和端口号。
连接方式: OkHttp 使用 SOCKS 协议与代理服务器建立连接,并将目标服务器的地址和端口号传递给代理服务器。代理服务器负责将连接转发到目标服务器,并进行数据转发。
举例:
假设您要访问网站 www.example.com,使用 socks://proxy.example.com:1080 作为 SOCKS5 代理服务器。
Proxy.Type.SOCKS: OkHttp 会解析出 proxy.example.com 和 1080。
- 连接流程:
OkHttp 使用 SOCKS5 协议与 proxy.example.com:1080 建立连接。
OkHttp 将 www.example.com 的地址和端口号传递给代理服务器。
代理服务器负责将连接转发到 www.example.com。
OkHttp 与 www.example.com 进行数据通信,所有数据都会通过代理服务器转发。
选择哪种代理:
- 如果需要代理各种网络应用,例如 HTTP、HTTPS、FTP、SSH 等,可以选择 SOCKS 代理。
- 如果只处理 HTTP 请求,并且需要一些安全功能,可以选择 HTTP 代理。
总结:
SOCKS 代理更像是一个网络连接的中介,它支持各种协议,提供更高的透明性和灵活性;而 HTTP 代理则专用于处理 HTTP 请求,并提供了一些安全功能。 选择哪种代理取决于你的具体需求。
MockWebServer模拟websocket server测试
example:
init {
mockWebServer.start()
sleep(1000)
webSocketClient = WebSocketClient(mockWebServer.url("/").toString())
}
@Test
fun testWebSocketOrigin() {
val webSocket = OkHttpClient().newWebSocket(Request.Builder().url(mockWebServer.url("/")).build(), clientListener)
mockWebServer.enqueue(MockResponse().withWebSocketUpgrade(serverClientListener).setBody("first"))
mockWebServer.enqueue(MockResponse().withWebSocketUpgrade(serverClientListener).setBody("second").setResponseCode(200))
mockWebServer.enqueue(MockResponse().withWebSocketUpgrade(serverClientListener).setBody("third").setResponseCode(200))
val message = "Hello from client!"
webSocket.send(message)
webSocket.send("client send twice")
sleep(1000)
webSocket.close(StatusCode.NORMAL_CLOSE.code, "normal close")
}
Ktor - kotlin跨平台的网络通信组件
Ktor 的 HttpTimeout
插件并不直接适用于 WebSocket 连接。
HttpTimeout
插件专为 HTTP 请求设计,主要用于设置请求超时和连接超时。
WebSocket 是一种持续的双向通信协议,不像 HTTP 请求那样具有明确的开始和结束。因此,HttpTimeout
的超时机制并不适用于 WebSocket 的持续连接。
为 WebSocket 设置超时,需要在代码层面上进行控制:
- 使用
kotlinx.coroutines
的withTimeout
或withTimeoutOrNull
函数:
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.features.websocket.*
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
suspend fun main() {
val client = HttpClient(CIO) {
install(WebSockets)
}
val job = launch {
try {
client.webSocket(url = "ws://your-websocket-server.com") {
// 在此处处理 WebSocket 连接
for (message in incoming) {
println("收到消息: $message")
}
}
} catch (e: Exception) {
println("WebSocket 连接异常: ${e.message}")
} finally {
client.close()
}
}
// 设置超时时间
withTimeout(3000L) {
// 等待 WebSocket 连接成功
job.join()
}
if (job.isActive) {
// 超时,取消 WebSocket 连接
job.cancel()
}
}
参考链接:
OKhttp深入理解--WebSocket的支持 · okhttpdochttps://seekting.gitbooks.io/okhttpdoc/content/gitbook/chapter13/content.html
medium.com--okhttp-in-androidhttps://medium.com/@manuaravindpta/okhttp-in-android-4c2771141f79
Recipes - OkHttpA collection of common/useful code examples for Kotlin and Javahttps://square.github.io/okhttp/recipes/
HTTP 标头https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers#%E9%80%90%E8%B7%B3%EF%BC%88hop-by-hop%EF%BC%89%E6%A0%87%E5%A4%B4
WebSockethttps://square.github.io/okhttp/5.x/okhttp/okhttp3/-web-socket/index.html