# RunAutoTest.ps1 —— 启动两条中继并跑 TankiOffline 接入测试 # # 真实链路是两段连接: # 大厅:9091 → wss://c2.3dtank.com:9090/(Hash Request / Hash Response) # 空间:9092 → wss://c2.3dtank.com:9090/(首帧 EnterSpace → 空间帧;实测 c2 才会回空间数据) # # 用法: # powershell -ExecutionPolicy Bypass -File .\tools\RunAutoTest.ps1 # powershell -ExecutionPolicy Bypass -File .\tools\RunAutoTest.ps1 -TimeoutSec 30 -SpaceId 100073070 param( [long]$SpaceId = 100073070, [int]$TimeoutSec = 25, [int]$LobbyPort = 9091, [int]$SpacePort = 9092, [string]$LobbyUpstream = 'wss://c2.3dtank.com:9090/', [string]$SpaceUpstream = 'wss://c2.3dtank.com:9090/' ) $ErrorActionPreference = 'Stop' $Root = Split-Path -Parent $PSScriptRoot $Tools = Join-Path (Split-Path -Parent $Root) '3DTank\tools' $RelayLobbyOut = Join-Path $env:TEMP 'tankioffline-relay-lobby.out.log' $RelayLobbyErr = Join-Path $env:TEMP 'tankioffline-relay-lobby.err.log' $RelaySpaceOut = Join-Path $env:TEMP 'tankioffline-relay-space.out.log' $RelaySpaceErr = Join-Path $env:TEMP 'tankioffline-relay-space.err.log' if (-not (Test-Path (Join-Path $Tools 'wss_server.js'))) { throw "找不到中继脚本:$Tools\wss_server.js" } function Start-Relay([int]$Port, [string]$Upstream, [string]$Out, [string]$Err, [string]$Label) { $Args = @( 'wss_server.js', '--port', "$Port", '--upstream', $Upstream, '--dump-every', '0', '--log', '0', '--quiet', '1', '--tunnel-reconnect', '0', '--label', $Label ) Write-Host "启动中继 $Label:$Upstream → localhost:$Port" return Start-Process -FilePath 'node' -ArgumentList $Args -WorkingDirectory $Tools -PassThru -WindowStyle Hidden ` -RedirectStandardOutput $Out -RedirectStandardError $Err } function Wait-Port([int]$Port, [string]$Name) { for ($I = 0; $I -lt 50; $I++) { Start-Sleep -Milliseconds 200 try { $Client = New-Object System.Net.Sockets.TcpClient $Client.Connect('127.0.0.1', $Port) $Client.Close() return } catch { } } throw "$Name 端口 $Port 未启动" } $RelayLobby = Start-Relay $LobbyPort $LobbyUpstream $RelayLobbyOut $RelayLobbyErr 'autotest-lobby' $RelaySpace = Start-Relay $SpacePort $SpaceUpstream $RelaySpaceOut $RelaySpaceErr 'autotest-space' try { Wait-Port $LobbyPort '大厅中继' Wait-Port $SpacePort '空间中继' $env:TANKIOFFLINE_AUTOTEST = '1' $env:TANKIOFFLINE_AUTOTEST_URL = "ws://localhost:$LobbyPort/" $env:TANKIOFFLINE_AUTOTEST_SPACE_URL = "ws://localhost:$SpacePort/" $env:TANKIOFFLINE_AUTOTEST_SPACE = "$SpaceId" $env:TANKIOFFLINE_AUTOTEST_TIMEOUT = "$($TimeoutSec * 1000)" Write-Host "运行客户端:大厅 $($env:TANKIOFFLINE_AUTOTEST_URL) / 空间 $($env:TANKIOFFLINE_AUTOTEST_SPACE_URL)" & (Join-Path $Root 'gradlew.bat') ':app:jsNodeDevelopmentRun' '--console=plain' $Code = $LASTEXITCODE Write-Host "客户端退出码:$Code" exit $Code } finally { foreach ($P in @($RelayLobby, $RelaySpace)) { if ($P -and -not $P.HasExited) { Stop-Process -Id $P.Id -Force -ErrorAction SilentlyContinue } } Write-Host '中继已停止' }