Skip to content

Commit

Permalink
chore: update README.md, perfer use B/s, fix upload error
Browse files Browse the repository at this point in the history
  • Loading branch information
XGHeaven committed Oct 22, 2023
1 parent ab40d67 commit 003d977
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 24 deletions.
43 changes: 29 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,57 @@
# Homebox

家庭网络工具箱,主要用于组建家庭局域网时的一些调试、检测、压测工具。

> 需要家庭内有一个较强服务端,否则服务端可能会成为瓶颈。测试端需要使用现代新版浏览器,比如 Chrome/Firefox 等。如果测速的是高速网络,请尝试保证机器 CPU 性能足够强劲
家庭网络工具箱。用于组建家庭局域网时,对网络进行调试、检测、压测的工具集合。

## Feature

- 面向未来浏览器设计
- 高达 10G 的浏览器速度测试
- 自带 Ping 检测
- 丰富的自定义测速参数
- 服务端无需固态要求
- 服务端无需像传统文件拷贝一样需要固态的支持
- 友好的 UI 交互
- 针对低速网络(< 2.5G)优化测速资源占用

[v1 进度追踪看板](https://github.com/XGHeaven/homebox/projects/1)

## Screenshot

![dark-theme](./doc/dark-theme.png)

![light-theme](./doc/light-theme.png)

## Requirement

- 本软件需要一个服务端进行部署,然后通过客户端访问网页进行测试
- 当需要对万兆以上网络测试的时候,需要保证客户端的性能(主要为 CPU 单核)足够强劲,否则可能会成为瓶颈。
具体的要求可以看后文的[性能测试](#Performance)

## Install

### Docker

首先你需要有一台服务器,只要能支持安装 Docker 即可,比如群辉、FreeNas、unRaid、CentOS 等等,暂时只支持 x86 服务器。

```bash
docker run -d -p 3300:3300 --name homebox xgheaven/homebox
```

安装并启动 `xgheaven/homebox` 镜像,默认情况下暴露的端口是 `3300`
然后在浏览器中输入 `http://server.ip:3300` 即可,如果重映射了端口,请输入映射后的端口
然后在浏览器中输入 `http://your.server.ip:3300` 即可

### Binary

直接在 [Release](https://github.com/XGHeaven/homebox/releases) 下载对应版本即可。

解压之后直接执行编译好的二进制文件即可
解压之后直接执行编译好的二进制文件,各个平台的执行方式应该不用我教了吧

## Usage

输入网址之后,会看到分为两种测试模式,分别是单次测速和持续压测。

- **单次测速**的模式下,会依次执行 Ping/Download/Upload 测试,一般可以直接用这个模式。
- **持续压测**的模式下,可以无限制以最高速度压测链路,通常可以用于设备移动中链路稳定性测试、多设备压测、路由器转发散热性能测试等。
- **持续压测**的模式下,可以不限时的以最高速度压测链路,通常可以用于设备移动中链路稳定性测试、多设备压测、路由器转发散热性能测试等。

默认情况下,设备会以低速模式运行,适用于大部分网络情况。
也可以在**高级配置**中切换为高速模式,此时会将客户端资源榨干的方式尽可能压榨网络流量,用于万兆以上的高速网络。

### Terminal(WIP)

Expand All @@ -51,7 +60,7 @@

## Design

由于众所周知的原因,浏览器中 js 的效率是比较低的,而且在网络请求的时候,还是占用大量的内存
由于众所周知的原因,浏览器中 JavaScript 的效率是比较低的,再加上网络请求的时候,需要占用大量的内存
所以为了避免主线程的卡顿,所有的请求都是在 Web Worker 中进行的。

但仅仅一个 Worker 是支撑不住万兆网络的测速要求的,因为一个 Worker 并发请求的能力依旧很低。
Expand All @@ -64,14 +73,20 @@
这就是为什么会有两种模式的原因,**高速模式****低速模式**
在高速模式下,会启用多 Worker,而低速模式下,仅仅启用一个 Worker 来减少资源的占用。

## Tests
## Performance

> 目前我暂时没有万兆以上的移动端设备,如果哪位小伙伴有的话,可以将结果告诉我
以下为客户端测试

- 在 2017 款 13 寸 Macbook 上,低速配置下能够实现 4G 下载速度以及 3G 上传速度
- 在 2019 款 16 寸 Macbook 上,在开启高速模式下,最高可以达到 12G 的下载速度以及 10G 的上传速度
- 在 AMD 3600 的设备上,高速模式下可以达到 15G 的下载速度以及 12G 的上传速度

## Powered by

- Golang(gin)
- TypeScript
- React
- Golang(gin) 服务端
- TypeScript 前端语言
- React 前端框架
- Rspack 前端打包工具
- 其他依赖请查看相应文件
2 changes: 1 addition & 1 deletion script/pack-arch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ for file in *; do
assets+=("-a" "$file")
done

hub release create "${assets[@]}" -m "${tag##*/}" "${tag##*/}"
gh release create "${tag##*/}" --notes-from-tag "${assets[@]}"
18 changes: 9 additions & 9 deletions web/src/components/case-config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ export function CaseConfig(props: { defaultValue?: Config; onChange?: (v: Config
speedRange: createFormField(defaultValue?.speedMode ?? SpeedMode.LOW, {}),
packCount: createFormField(defaultValue?.packCount ?? 64, {}),
parallel: createFormField(defaultValue?.parallel ?? 3, {}),
unit: createFormField(defaultValue?.unit ?? RateUnit.BIT),
unit: createFormField(defaultValue?.unit ?? RateUnit.BYTE),
duration: createFormField(
defaultValue?.duration === Infinity ? 10 : (defaultValue?.duration ?? 10 * 1000) / 1000,
),
Expand Down Expand Up @@ -312,14 +312,6 @@ export function CaseConfig(props: { defaultValue?: Config; onChange?: (v: Config
</Button>
</ButtonGroup>
<ButtonGroup css={css`${$mgr8}${$valm}`}>
<Button
title='Bit per second'
intent={unit.value === RateUnit.BIT ? 'success' : 'none'}
onClick={() => unit.onChange(RateUnit.BIT)}
icon={unit.value === RateUnit.BIT ? 'small-tick' : undefined}
>
b/s
</Button>
<Button
title='Byte per second'
intent={unit.value === RateUnit.BYTE ? 'success' : 'none'}
Expand All @@ -328,6 +320,14 @@ export function CaseConfig(props: { defaultValue?: Config; onChange?: (v: Config
>
B/s
</Button>
<Button
title='Bit per second'
intent={unit.value === RateUnit.BIT ? 'success' : 'none'}
onClick={() => unit.onChange(RateUnit.BIT)}
icon={unit.value === RateUnit.BIT ? 'small-tick' : undefined}
>
b/s
</Button>
</ButtonGroup>
<ButtonGroup css={$valm}>
<Button
Expand Down

0 comments on commit 003d977

Please sign in to comment.