Skip to content

Commit 1e88dd9

Browse files
2dustAnGgIt886
authored andcommitted
Adding latency test for hy2
1 parent 35b3f0d commit 1e88dd9

File tree

5 files changed

+43
-23
lines changed

5 files changed

+43
-23
lines changed

app/src/main/kotlin/com/neko/v2ray/dto/Hysteria2Bean.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ data class Hysteria2Bean(
66
val lazy: Boolean? = true,
77
val obfs: ObfsBean? = null,
88
val socks5: Socks5Bean? = null,
9+
val http: Socks5Bean? = null,
910
val tls: TlsBean? = null,
1011
) {
1112
data class ObfsBean(

app/src/main/kotlin/com/neko/v2ray/service/V2RayTestService.kt

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ package com.neko.v2ray.service
33
import android.app.Service
44
import android.content.Intent
55
import android.os.IBinder
6+
import android.util.Log
67
import com.neko.v2ray.AppConfig.MSG_MEASURE_CONFIG
78
import com.neko.v2ray.AppConfig.MSG_MEASURE_CONFIG_CANCEL
89
import com.neko.v2ray.AppConfig.MSG_MEASURE_CONFIG_SUCCESS
9-
import com.neko.v2ray.dto.ConfigResult
10+
import com.neko.v2ray.dto.EConfigType
1011
import com.neko.v2ray.extension.serializable
11-
import com.neko.v2ray.util.JsonUtil
1212
import com.neko.v2ray.util.MessageUtil
13+
import com.neko.v2ray.util.MmkvManager
14+
import com.neko.v2ray.util.PluginUtil
1315
import com.neko.v2ray.util.SpeedtestUtil
1416
import com.neko.v2ray.util.Utils
17+
import com.neko.v2ray.util.V2rayConfigUtil
1518
import go.Seq
1619
import kotlinx.coroutines.CoroutineScope
1720
import kotlinx.coroutines.Job
@@ -33,11 +36,10 @@ class V2RayTestService : Service() {
3336
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
3437
when (intent?.getIntExtra("key", 0)) {
3538
MSG_MEASURE_CONFIG -> {
36-
val content = intent.serializable<String>("content") ?: ""
37-
val config = JsonUtil.fromJson(content, ConfigResult::class.java)
39+
val guid = intent.serializable<String>("content") ?: ""
3840
realTestScope.launch {
39-
val result = SpeedtestUtil.realPing(config.content)
40-
MessageUtil.sendMsg2UI(this@V2RayTestService, MSG_MEASURE_CONFIG_SUCCESS, Pair(config.guid, result))
41+
val result = startRealPing(guid)
42+
MessageUtil.sendMsg2UI(this@V2RayTestService, MSG_MEASURE_CONFIG_SUCCESS, Pair(guid, result))
4143
}
4244
}
4345

@@ -51,4 +53,29 @@ class V2RayTestService : Service() {
5153
override fun onBind(intent: Intent?): IBinder? {
5254
return null
5355
}
56+
57+
private fun startRealPing(guid: String): Long {
58+
val retFailure = -1L
59+
60+
val server = MmkvManager.decodeServerConfig(guid) ?: return retFailure
61+
if (server.getProxyOutbound()?.protocol?.equals(EConfigType.HYSTERIA2.name, true) == true) {
62+
val socksPort = Utils.findFreePort(listOf(0))
63+
PluginUtil.runPlugin(this, server, "0:${socksPort}")
64+
Thread.sleep(1000L)
65+
66+
var delay = SpeedtestUtil.testConnection(this, socksPort)
67+
if (delay.first < 0) {
68+
Thread.sleep(10L)
69+
delay = SpeedtestUtil.testConnection(this, socksPort)
70+
}
71+
PluginUtil.stopPlugin()
72+
return delay.first
73+
} else {
74+
val config = V2rayConfigUtil.getV2rayConfig(this, guid)
75+
if (!config.status) {
76+
return retFailure
77+
}
78+
return SpeedtestUtil.realPing(config.content)
79+
}
80+
}
5481
}

app/src/main/kotlin/com/neko/v2ray/util/SpeedtestUtil.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ object SpeedtestUtil {
9898
}
9999
}
100100

101-
fun testConnection(context: Context, port: Int): String {
102-
// return V2RayVpnService.measureV2rayDelay()
101+
fun testConnection(context: Context, port: Int): Pair<Long, String> {
103102
var result: String
103+
var elapsed = -1L
104104
var conn: HttpURLConnection? = null
105105

106106
try {
@@ -120,7 +120,7 @@ object SpeedtestUtil {
120120

121121
val start = SystemClock.elapsedRealtime()
122122
val code = conn.responseCode
123-
val elapsed = SystemClock.elapsedRealtime() - start
123+
elapsed = SystemClock.elapsedRealtime() - start
124124

125125
if (code == 204 || code == 200 && conn.responseLength == 0L) {
126126
result = context.getString(R.string.connection_test_available, elapsed)
@@ -134,10 +134,7 @@ object SpeedtestUtil {
134134
}
135135
} catch (e: IOException) {
136136
// network exception
137-
Log.d(
138-
AppConfig.ANG_PACKAGE,
139-
"testConnection IOException: " + Log.getStackTraceString(e)
140-
)
137+
Log.d(AppConfig.ANG_PACKAGE, "testConnection IOException: " + Log.getStackTraceString(e))
141138
result = context.getString(R.string.connection_test_error, e.message)
142139
} catch (e: Exception) {
143140
// library exception, eg sumsung
@@ -147,7 +144,7 @@ object SpeedtestUtil {
147144
conn?.disconnect()
148145
}
149146

150-
return result
147+
return Pair(elapsed, result)
151148
}
152149

153150
fun getLibVersion(): String {

app/src/main/kotlin/com/neko/v2ray/util/fmt/Hysteria2Fmt.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ object Hysteria2Fmt {
9999
socks5 = Hysteria2Bean.Socks5Bean(
100100
listen = "$LOOPBACK:${socksPort}",
101101
),
102+
http = Hysteria2Bean.Socks5Bean(
103+
listen = "$LOOPBACK:${socksPort}",
104+
),
102105
tls = Hysteria2Bean.TlsBean(
103106
sni = tls?.serverName ?: outbound.getServerAddress(),
104107
insecure = tls?.allowInsecure

app/src/main/kotlin/com/neko/v2ray/viewmodel/MainViewModel.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import com.neko.v2ray.util.MessageUtil
2929
import com.neko.v2ray.util.MmkvManager
3030
import com.neko.v2ray.util.SpeedtestUtil
3131
import com.neko.v2ray.util.Utils
32-
import com.neko.v2ray.util.V2rayConfigUtil
3332
import kotlinx.coroutines.CoroutineScope
3433
import kotlinx.coroutines.Dispatchers
3534
import kotlinx.coroutines.Job
@@ -213,14 +212,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
213212
getApplication<AngApplication>().toast(R.string.connection_test_testing)
214213
viewModelScope.launch(Dispatchers.Default) { // without Dispatchers.Default viewModelScope will launch in main thread
215214
for (item in serversCopy) {
216-
val config = V2rayConfigUtil.getV2rayConfig(getApplication(), item.guid)
217-
if (config.status) {
218-
MessageUtil.sendMsg2TestService(
219-
getApplication(),
220-
AppConfig.MSG_MEASURE_CONFIG,
221-
JsonUtil.toJson(config)
222-
)
223-
}
215+
MessageUtil.sendMsg2TestService(getApplication(), AppConfig.MSG_MEASURE_CONFIG, item.guid)
224216
}
225217
}
226218
}

0 commit comments

Comments
 (0)