Browse Source

优化udp发送文件的方法

master
453530270@qq.com 2 years ago
parent
commit
c1db672f16
  1. 109
      fssc/internal/handler/handler.go
  2. 2
      fssc/web/list.tmpl

109
fssc/internal/handler/handler.go

@ -1,6 +1,7 @@
package handler
import (
"encoding/json"
"fmt"
"html/template"
"net"
@ -119,34 +120,11 @@ func Supfile(w http.ResponseWriter, r *http.Request) {
// 替换 反斜杠
bbpath := strings.Replace(bpath, "/", "\\", -1)
// 拼装, 文件的实际地址
ziprl := filepath.Join(bbpath, "/", bfile)
ziprl := filepath.Join(config.G.FilePath, bbpath, "/", bfile)
// 1、获取udp addr
remoteAddr, err := net.ResolveUDPAddr("udp", serip[0]+":9099")
if err != nil {
fmt.Printf("Failed to resolve %s: %v\n", serip[0], err)
return
}
// 2、 监听端口
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
fmt.Printf("Failed to dial %s: %v\n", serip[0], err)
return
}
defer conn.Close()
// 3、在端口发送数据
message := fmt.Sprintf("%s%s%s", config.G.DeviceName, "|", "sender")
// 向链接通道发送数据 数据包头
conn.Write([]byte(message))
// 发送文件
go func() {
err := transfer.SendFiles(ziprl, fmt.Sprintf("http://%s", remoteAddr))
if err != nil {
fmt.Printf("Send file to %s error: %s\n", remoteAddr, err)
}
}()
// 页面上显示
fmt.Fprintf(w, "File:%s\\/%s,been sent successfully.", sbfile, sbpath)
// 创建udp 渠道发送数据
message := fmt.Sprintf("%s%s%s", "xdml|", bbpath, "|sender")
UdpSendFile(serip[0], ziprl, bfile, message, w)
fmt.Fprintf(w, "deubg.....")
}
@ -218,32 +196,8 @@ func SendZip(w http.ResponseWriter, r *http.Request) {
if strings.EqualFold(strings.ToLower(rest), "arcok") {
fmt.Println("archive is sending...")
// 创建udp 渠道发送数据
// 1、获取udp addr
remoteAddr, err := net.ResolveUDPAddr("udp", serip[0]+":9099")
if err != nil {
fmt.Printf("Failed to resolve %s: %v\n", serip[0], err)
return
}
// 2、 监听端口
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
fmt.Printf("Failed to dial %s: %v\n", serip[0], err)
return
}
defer conn.Close()
// 3、在端口发送数据
message := fmt.Sprintf("%s%s%s", config.G.DeviceName, "|", "sender")
// 向链接通道发送数据 数据包头
conn.Write([]byte(message))
// 发送文件
go func() {
err := transfer.SendFiles(ziprl, fmt.Sprintf("http://%s", remoteAddr))
if err != nil {
fmt.Printf("Send file to %s error: %s\n", remoteAddr, err)
}
}()
// 页面上显示
fmt.Fprintf(w, "File:%s,been sent successfully.", zpFileName)
UdpSendFile(serip[0], ziprl, zpFileName, message, w)
} else {
fmt.Println("archive is not exist!!!")
}
@ -309,3 +263,54 @@ func SendHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
// // 定义错误返回的json
type ErrJson struct {
Msg string `json:"message"`
}
// udp 模式发送文件
/*
* serip 服务器ip,
* absfilepath 发送文件的时间路径,
* fname 文件名
* message 携带部分信息的消息
* http.ResponseWriter
*/
func UdpSendFile(serip string, absfilepath string, fname string, message string, w http.ResponseWriter) {
// 1、获取udp addr
remoteAddr, err := net.ResolveUDPAddr("udp", serip+":9099")
if err != nil {
mstr := fmt.Sprintf("Failed to resolve %s:%v", serip, err)
erjson := ErrJson{mstr}
outmsg, _ := json.Marshal(erjson)
w.Header().Set("Content-Type", "application/json")
w.Write(outmsg)
return
}
// 2、 监听端口
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
ustr := fmt.Sprintf("Failed to dial %s: %v", serip, err)
erjson := ErrJson{ustr}
outmsg, _ := json.Marshal(erjson)
w.Header().Set("Content-Type", "application/json")
w.Write(outmsg)
return
}
defer conn.Close()
// 3、在端口发送数据
//message := fmt.Sprintf("%s%s%s", config.G.DeviceName, "|", "sender")
// 向链接通道发送数据 数据包头
conn.Write([]byte(message))
// 发送文件
go func() {
err := transfer.SendFiles(absfilepath, fmt.Sprintf("http://%s", remoteAddr))
if err != nil {
fmt.Printf("Send file to %s error: %s\n", remoteAddr, err)
}
}()
// 页面上显示
fmt.Fprintf(w, "File:%s,been sent successfully.", fname)
}

2
fssc/web/list.tmpl

@ -153,7 +153,7 @@
<svg class="file-icon" viewBox="0 0 24 24">
<path fill="currentColor" d="M14 2H6C4.9 2 4 2.9 4 4V20C4 21.1 4.9 22 6 22H18C19.1 22 20 21.1 20 20V8L14 2M13 9V3.5L18.5 9H13Z" />
</svg>
<a href="/up?p={{b64en $.DownloadPath}}&f={{b64en .Name}}" class="button" title="更新{{ .Name }}">{{ .Name }}</a>
<a href="/up?p={{b64en $.UrlPath}}&f={{b64en .Name}}" class="button" title="更新{{ .Name }}">{{ .Name }}</a>
<span style="display:none" class="badge">{{.Info.Size}}</span><span class="badge" > {{.Info.ModTime.Format "2006-01-02 15:04:05"}} </span>

Loading…
Cancel
Save