令人头秃的:你的主机中的软件中止了一个已建立的连接

简介: 令人头秃的:你的主机中的软件中止了一个已建立的连接

网络异常,图片无法展示
|


1. 前言



最近在答疑群中,经常看到同学们遇到 你的主机中的软件中止了一个已建立的连接 这样的报错,这个报错可能的原因还挺多的,本质上是,无法连接服务。


一般来说,我们在poco初始化,或者是poco初始化之后“第一个”控件操作的语句中,就容易出现这个问题。


下面我们详细看下可能导致这个问题的几个常见场景:


2. 游戏应用未接入pocoSDK



如果我们的测试应用并非Android/iOS原生应用,而是游戏应用,那我们在初始化该游戏应用的poco之前,就需要先给游戏应用接入游戏引擎对应的PocoSDK。


成功接入PocoSDK并且应用打包过程无报错之后,我们可以在设备上 安装并启动 该应用,之后使用最新版的AirtestIDE连接该设备,在poco辅助窗选择正确的poco模式,查看能否显示正常的UI树。这个过程可以用来判断我们的游戏包,当前是否已经成功接入了对应的PocoSDK。


未接入pocoSDK的游戏应用,我们在初始化其poco时,将出现下述报错:


ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
复制代码


因为此时包内没有挂载poco服务,我们无法与游戏建立通讯。


3. Poco初始化顺序问题



还有一种常见的情况是,我明明已经在游戏包内接入了pocoSDK,并且在IDE也可以正常看到游戏的UI树了,但是跑脚本的时候,却没法正常初始化poco,或者跑到第一个poco语句时,就报错 你的主机中的软件中止了一个已建立的连接 ,通常是因为一些初始化的顺序问题。


其实本质问题是,我们的pocoSDK是接入在游戏内的,所以只有当游戏正常启动,进入到主界面之后,poco服务才会开始起来(通常会把poco服务挂载到根节点,以保证游戏启动后,能尽快建立poco服务)。


所以我们会要求在启动游戏之后,才去查看它的UI树,或者初始化该游戏的poco。


但有时候在写脚本的时候,可能没有关注到这个问题,我们来看这样子的一个示例代码:


# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
start_app("com.NetEase")
sleep(1.0)
poco("btn_start").click()
复制代码


看起来没有很大的问题,连接设备、初始化了一个unity poco,启动游戏,点击游戏内的控件,如果这里是Android poco的话,确实没有问题。


但是,我们强调过,游戏的poco服务是在应用里面的,我们这里没有启动游戏,也就意味着还没有启动游戏内的poco服务,此时强行先初始化一个unity poco,结果就之能是收到1个 你的主机中的软件中止了一个已建立的连接 的报错了。


网络异常,图片无法展示
|


那我们把顺序调整下:


# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])
start_app("com.NetEase")
sleep(1.0)
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
poco("btn_start").click()
复制代码


这下应该没问题了吧,连接设备、启动游戏应用、初始化游戏poco,最后才进行控件操作,一切看起来都那么完美!


但是,实际运行过程,居然还是有很大概率收到 你的主机中的软件中止了一个已建立的连接 的报错,真是令人头秃!!


其实这里还有一个非常细碎的小细节需要注意下,就是我们使用 start_app 启动游戏应用,大部分游戏,启动到进入主界面时,也就是完全启动游戏,是需要一定时间的,可能是5s,可能是10s,这个跟设备和具体的游戏应用,都有关系,而在游戏没有完全启动时,里面的poco服务也没办法跟着起来,这就导致还有很大的概率出现报错了。


所以我们尽量在 start_app 之后,增加尽可能长一点的 sleep ,以确保游戏完成启动,再来初始化我们的游戏poco,同理,poco初始化语句之后,也可以适当的添加一点sleep,来保证poco初始化成功,再来进行控件操作:


# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])
start_app("com.NetEase")
sleep(6.0)
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
sleep(3.0)
poco("btn_start").click()
复制代码


记住正确的顺序:先连接设备(一般在 auto_setup 接口里面连接)--> 再打开应用(一般用 start_app 接口)--> 等应用开启完毕(这里添加足够的 sleep ),最后才初始化 poco 。


4. 初始化远程iOS设备的poco问题



目前,我们仅支持初始化本地连接的iOS设备的poco(查看本地连接iOS设备的UI树),不支持初始化远程连接的iOS的poco。


强行初始化远程iOS设备的poco时,也将无法成功连接上服务。


5. Windows游戏的poco初始化问题



以Windows上的unity游戏为例,当我们在该客户端游戏上成功接入pocoSDK之后,我们支持在该Windows游戏上使用poco。


但是它的初始化脚本,与Android设备的unity poco,又有一些不一样:


# Android设备上的unity poco初始化
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
# Windows上的unity poco初始化
dev = connect_device('Windows:///?title_re=^your game title.*$')
addr = ('', 5001)
poco = UnityPoco(addr, device=dev)
复制代码


如果我们在Windows的unity游戏上,使用Android的初始化方式,也会导致无法连接服务,从而产生 你的主机中的软件中止了一个已建立的连接 的报错。


6. 连线不稳定的问题



也有少部分情况是,数据线连线不稳定的问题,导致连接暂时断了一下。如果我们在跑脚本的时候,发现一些不固定位置的偶现断开连接的报错,可以考虑是数据线连线不稳定的问题,请及时更换稳定的数据线,再来进行脚本跑测。


7. 其它问题



除了上述问题以外,可能还有一些别的问题,我们这里没有讲到;同学们在遇到该问题时,优先排除以上几个问题。

相关文章
|
存储 easyexcel Java
EasyExcel教程
EasyExcel教程
16571 0
|
C语言 C++ 开发者
软著申请流程详解
软著申请流程详解
4209 2
软著申请流程详解
|
Java 开发者 Docker
五种常用的 Spring Boot 热部署方式
【2月更文挑战第5天】
4011 0
五种常用的 Spring Boot 热部署方式
|
监控 安全 Java
在Java中集成第三方API调用的最佳实践
在Java中集成第三方API调用的最佳实践
|
缓存 Java
java: 警告: 源发行版 17 需要目标发行版 17,java17 无效的目标发行
java: 警告: 源发行版 17 需要目标发行版 17,java17 无效的目标发行
10532 59
|
网络安全 开发工具 git
使用Idea提交项目到远程仓库
本文介绍了如何在Idea中创建Git本地仓库、提交更改,并推送代码到Gitee远程仓库的步骤,包括创建本地仓库、提交更改、复制远程仓库地址、配置远程仓库以及推送代码到远程仓库的过程。
使用Idea提交项目到远程仓库
|
调度
【Cron表达式】cron表达式详细介绍以及常用的例子
【Cron表达式】cron表达式详细介绍以及常用的例子
4790 2
|
SQL druid Java
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
解决 ‘The last packet successfully received from the server was xxx milliseconds ago‘ 问题
6794 0
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
18780 0
|
Linux
Linux升级命令yum upgrade和yum update,有什么区别?
在日常开发工作中,根据不同的项目会需要配置环境和包,有时候会由于版本问题出现错误,这个时候通常就需要执行 update或者 upgrade命令,这里简要介绍一下区别。
3554 0
Linux升级命令yum upgrade和yum update,有什么区别?