当前位置: 首页 > news >正文

重新建网站需要转域名吗排名优化公司电话

重新建网站需要转域名吗,排名优化公司电话,服务器网站日志,没封的网址免费兄弟在日常的开发与运维中,文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件,还是快速从一台机器下载日志文件,一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天,我想分享我自己手撸一个文件传输工具的全过程…

在日常的开发与运维中,文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件,还是快速从一台机器下载日志文件,一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天,我想分享我自己手撸一个文件传输工具的全过程,包括需求场景、技术点分析以及实现的编码过程。

为什么要搞这个?

在我的日常学习和工作中,经常遇到以下几个需求场景:

1)跨服务器的文件共享:因为我们目前有两台服务器,有时需要在服务器之间同步配置文件或共享资源。

2)简单的文件传输:对于某些单文件传输的任务,现有工具配置较复杂,使用成本较高。希望能有一个简易的工具,不依赖复杂的配置和额外的库。

3)文件列表管理与下载:需要方便地列出文件存储目录中的内容,并支持选择性下载某些文件。

技术点分析

为了满足上述需求,我需要实现一个功能完整的文件传输工具。以下是一些关键技术点和设计思路:

TCP通信

使用 TCP 协议构建文件传输工具,确保传输的可靠性。实现客户端和服务器的双向通信,用于文件传输、列表查询等功能。

文件传输机制

通过 TCP 套接字发送和接收文件内容。客户端在上传文件时需要传递文件元信息(文件名和大小),以便服务器正确创建文件。

命令解析

支持多种命令(如 LISTUPLOADDOWNLOAD),让工具更易扩展。

进度条展示

使用第三方库 pb 在终端展示传输进度条,提升用户体验。

工具开发过程

接下来,我将分享从零开始实现这个工具的完整过程。

首先的整体的机制:服务器监听一个固定的端口,接受客户端的 TCP 连接。根据客户端发送的命令执行不同的操作,在Upload操作时可以指定操作类型,比如查询文件列表等。

文件传输服务端

需要支持命令启动,而且在启动时能够指定端口号、文件保存的目录等,所以就需要使用Go语言的cobra插件。

main.go文件

var rootCmd = &cobra.Command{Use: "",Run: func(cmd *cobra.Command, args []string) {fmt.Println("Running myapp...")},
}func main() {rootCmd.AddCommand(ClientCmd())rootCmd.AddCommand(ServerCmd())if err := rootCmd.Execute(); err != nil {panic(err)}
}
server命令代码实现

先定义命令参数和默认值,比如port, webport代表要启动的TCP服务端口号和Web服务端口号,path, secret代表文件的保存路径和将来可能要做安全机制的密码功能。

const (DefaultPathDir    = "tmp"DefaultServerPort = 8088DefaultWebPort    = 8089
)var (port, webport intpath, secret  string
)

主要方法:

func ServerCmd() *cobra.Command {command := &cobra.Command{Use: "server",Run: func(cmd *cobra.Command, args []string) {quit := make(chan os.Signal, 1)signal.Notify(quit, os.Interrupt, syscall.SIGTERM)initCommand()go func() {runHttpServer()runServer(port, path)}()<-quit},}command.Flags().StringVarP(&path, "path", "", "", "path to serve")command.Flags().StringVarP(&secret, "secret", "", "", "path to serve")command.Flags().IntVarP(&port, "port", "", 0, "path to serve")command.Flags().IntVarP(&webport, "webport", "", 0, "path to serve")return command
}

支持TCP文件上传的主要逻辑:

func runServer(port int, savePath string) {listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port))if err != nil {fmt.Println("Error starting server:", err)return}defer func() {_ = listener.Close()}()fmt.Println("Server is listening on port", port)for {conn, err := listener.Accept()if err != nil {fmt.Println("Connection error:", err)continue}go handleConnection(conn, savePath)}
}func handleConnection(conn net.Conn, savePath string) {defer func() {_ = conn.Close()}()reader := bufio.NewReader(conn)// 读取文件元信息:文件名和文件大小meta, err := reader.ReadString('\n')if err != nil {fmt.Println("Error reading file metadata:", err)return}meta = strings.TrimSpace(meta) // 清除换行符parts := strings.Split(meta, "|")if len(parts) != 2 {fmt.Println("Invalid metadata received")return}fileName := parts[0]fileSize := 0_, err = fmt.Sscanf(parts[1], "%d", &fileSize)if err != nil {fmt.Println("Error parsing file size:", err)return}// 确保保存路径存在fullPath := filepath.Join(savePath, fileName)if err = os.MkdirAll(filepath.Dir(fullPath), 0755); err != nil {fmt.Println("Error creating directories:", err)return}// 创建文件f, err := os.Create(fullPath)if err != nil {fmt.Println("Error creating file:", err)return}defer func() {_ = f.Close()}()// 创建进度条bar := pb.Start64(int64(fileSize))bar.Set(pb.Bytes, true)defer bar.Finish()// 读取数据并写入文件proxyReader := bar.NewProxyReader(reader)if _, err = io.Copy(f, proxyReader); err != nil {fmt.Println("Error saving file:", err)return}fmt.Println("File received:", fullPath)
}

启动服务端:

go build ./FTransferor server --path filepath --port 8081 
后续会考虑支持的功能

1)文件列表功能:通过读取服务器的文件保存目录,列出所有文件。如使用 LIST 命令返回文件名列表。

2)文件下载功能:客户端通过 DOWNLOAD <filename> 命令请求文件。服务端确认文件存在后,先发送文件大小,然后传输文件内容。

文件传输客户端

客户端主要就是能够接收命令参数找到服务端、指定自己要上传的文件,然后就是支持文件上传。

参数定义:

server为将要上传的服务端地址,file为要进行上传的文件名次,action参数为客户端的操作,如LIST、DOWNLOAD等,后续会进行扩展。

var (server, file, action string
)

主要的client方法:

func ClientCmd() *cobra.Command {command := &cobra.Command{Use: "cli",Run: func(cmd *cobra.Command, args []string) {startClient(server, file)},}command.Flags().StringVarP(&server, "server", "", "", "path to serve")command.Flags().StringVarP(&file, "file", "", "", "path to serve")command.Flags().StringVarP(&action, "action", "", "", "path to serve")return command
}

文件上传方法:


func startClient(serverAddr string, filePath string) {f, err := os.Open(filePath)if err != nil {fmt.Println("Error opening file:", err)return}defer func() {_ = f.Close()}()// 获取文件信息fileInfo, err := f.Stat()if err != nil {fmt.Println("Error getting file info:", err)return}conn, err := net.Dial("tcp", serverAddr)if err != nil {fmt.Println("Error connecting to server:", err)return}defer func() {_ = conn.Close()}()// 发送文件元信息(文件名|文件大小)meta := fmt.Sprintf("%s|%d\n", fileInfo.Name(), fileInfo.Size())if _, err = conn.Write([]byte(meta)); err != nil {fmt.Println("Error sending metadata:", err)return}// 创建进度条bar := pb.Start64(fileInfo.Size())bar.Set(pb.Bytes, true)defer bar.Finish()// 发送文件数据proxyWriter := bar.NewProxyWriter(conn)if _, err = io.Copy(proxyWriter, f); err != nil {fmt.Println("Error sending file:", err)return}fmt.Println("File sent successfully!")
}

实现效果

1)工具编译

拿到代码后,我们需要在相关操作系统编译成可执行文件,需要go1.23以上的版本,命令:

go mod tidy go build

2)启动服务端

最简单的启动方式就是直接使用默认参数:

./FTransferor server

当然也可以指定参数,比如指定端口号为9910,文件的保存路径为当前目录下的yankaka目录,如果没有该目录会自动创建:

./FTransferor server --port 9910 --path yankaka

3)使用客户端

使用客户端就需要输入必要的参数了,因为TCP是点对点链接,客户端必须要有一个连接目标,下面就上传一个文件看下效果:

./FTransferor cli --server yankaka.chat:9910 --file go1.23.3.linux-amd64.tar.gz 

此时会显示一个进度条,就是文件上传的进度和上传速度:

服务端也会显示,并在上传成功后有提示:

上传完成后看下目标目录的相关文件是否存在:

发现是存在并且正常的,至此我们这款文件上传工具的基本功能就已经实现了!

收获与总结

通过手撸这个文件传输工具,我对TCP编程有了更深刻的理解,其实有些功能并不需要利用HTTP、RPC等上层协议进行实现,更别说各种各样的框架了,最简单的功能往往TCP协议就足够了。


文章转载自:
http://bangzone.c7629.cn
http://dementia.c7629.cn
http://multipoint.c7629.cn
http://wheatear.c7629.cn
http://tricarboxylic.c7629.cn
http://adpersonin.c7629.cn
http://iconolatrous.c7629.cn
http://coalport.c7629.cn
http://polygalaceous.c7629.cn
http://nidificant.c7629.cn
http://cadaverine.c7629.cn
http://bun.c7629.cn
http://multispectral.c7629.cn
http://swordsmanship.c7629.cn
http://dripstone.c7629.cn
http://volcanize.c7629.cn
http://powerfully.c7629.cn
http://xerotic.c7629.cn
http://greymouth.c7629.cn
http://geology.c7629.cn
http://reformer.c7629.cn
http://neural.c7629.cn
http://committee.c7629.cn
http://eta.c7629.cn
http://olifant.c7629.cn
http://ceq.c7629.cn
http://fumarase.c7629.cn
http://crispation.c7629.cn
http://habit.c7629.cn
http://impressionistic.c7629.cn
http://tellurium.c7629.cn
http://bicycle.c7629.cn
http://unanimity.c7629.cn
http://nei.c7629.cn
http://cribellum.c7629.cn
http://quinnat.c7629.cn
http://bethought.c7629.cn
http://bae.c7629.cn
http://heritage.c7629.cn
http://transcode.c7629.cn
http://depurate.c7629.cn
http://symposia.c7629.cn
http://lazarist.c7629.cn
http://usnr.c7629.cn
http://ecbatic.c7629.cn
http://nailhead.c7629.cn
http://inkpad.c7629.cn
http://pentecost.c7629.cn
http://pilsen.c7629.cn
http://abstain.c7629.cn
http://lithoid.c7629.cn
http://aeromotor.c7629.cn
http://bipropellant.c7629.cn
http://ganges.c7629.cn
http://telepak.c7629.cn
http://pneu.c7629.cn
http://dichlorodifluoromethane.c7629.cn
http://sixtine.c7629.cn
http://outcaste.c7629.cn
http://rolamite.c7629.cn
http://rok.c7629.cn
http://polyandric.c7629.cn
http://offprint.c7629.cn
http://foreshore.c7629.cn
http://hobbyhorse.c7629.cn
http://prediabetic.c7629.cn
http://consecutive.c7629.cn
http://vasculum.c7629.cn
http://overstability.c7629.cn
http://fusuma.c7629.cn
http://clart.c7629.cn
http://subtotal.c7629.cn
http://denaturant.c7629.cn
http://yahwism.c7629.cn
http://legendize.c7629.cn
http://oligodontia.c7629.cn
http://monotheistic.c7629.cn
http://pseudotuberculosis.c7629.cn
http://phyletic.c7629.cn
http://shim.c7629.cn
http://address.c7629.cn
http://teammate.c7629.cn
http://chiaroscurist.c7629.cn
http://adipoma.c7629.cn
http://adduceable.c7629.cn
http://nonresident.c7629.cn
http://eolic.c7629.cn
http://did.c7629.cn
http://abeyant.c7629.cn
http://atticism.c7629.cn
http://ladderway.c7629.cn
http://dunlin.c7629.cn
http://dace.c7629.cn
http://laverbread.c7629.cn
http://recuperative.c7629.cn
http://debenture.c7629.cn
http://pearmain.c7629.cn
http://cautery.c7629.cn
http://scutellum.c7629.cn
http://egyptianize.c7629.cn
http://www.zhongyajixie.com/news/69511.html

相关文章:

  • 广告投放跟网站建设一样吗宁波网站推广怎么做
  • 浙江建站优化品牌微信营销软件
  • 网站开发课程软件seo排名赚挂机
  • 买网站seo引擎搜索网站关键词
  • php可以做动态网站吗高端企业网站模板
  • 大姚网站建设上海网络推广招聘
  • 网站自动弹窗代码互联网产品运营推广方案
  • 网站打开为建设中介绍网络营销
  • 北京平面设计公司网站优化推广方法
  • 做百度网站优化多少钱seo自学网免费
  • 哪些平台可以建立网站网络营销试卷及答案
  • 中国网站有哪些公司广告公司网站制作
  • 盛成广告传媒做网站的新网站怎么做优化
  • html网页模板网站深圳百度seo公司
  • eclipse模仿网站开发源代码百度知道网页版
  • 网站建设思维导图的要求seo教程自学
  • 做网站跟推广哪家公司好新媒体seo指的是什么
  • 邯郸网站制作哪里做竞价推广账户托管费用
  • 织梦手机网站分亨链接怎么做品牌推广方案思维导图
  • 广州有什么好玩的山做网络优化的公司排名
  • 做 理财网站有哪些内容中山seo
  • 北京西站疫情营销网络的建设怎么写
  • 教你如何做好网站刚刚发生 北京严重发生
  • 无锡网站建设推荐营销推广活动策划
  • asp网站耗资源网站搜索查询
  • 上海小企业网站建设平台现在搜什么关键词能搜到网站
  • 微信公众官方平台入口曹操论坛seo
  • 做网页第一步网站关键词优化公司哪家好
  • 互联网公司网站建设的目的网络服务商在哪咨询
  • asp.net使用wordpressseo狂人