go - 向客户端发送 CSV 文件服务器

标签 go tcp

我最近才开始尝试学习 Go,我正在尝试编写一个小型服务器/客户端应用程序,用于将 csv 文件从服务器发送到客户端。尝试将结构编码为 BigEndian 二进制文件时遇到无效类型错误。我的结构似乎已经是二进制格式,我不确定为什么会出现以下错误:

将二进制缓冲区写入大端二进制文件时出错。写入:无效类型 *main.DataPack

此外,我想在发送文件后保持 TCP 连接打开,这就是我不使用 io.Copy 的原因。

目前,我通过发送“\x00”字节来触发文件上传处理:

// Server
package main 

import (
    "path/filepath"
    "fmt"
    "io/ioutil"
    "net"
    "os"
    "encoding/binary"
    "bytes"

)


type DataPack struct {
    Length   int64
    Contents []byte
}

func main() {

    absPath, _ := filepath.Abs("./progs.csv")

    data, _ := ioutil.ReadFile(absPath)
    fmt.Println("%s",data)

    tel, err := net.Listen("tcp", "0.0.0.0:23")
    if err != nil {
        fmt.Println(err)
        return
    }

    for {
        conn, err := tel.Accept()
        if err != nil {
            break
        }
        fmt.Println("above filehandler")
        go fileHandler(conn)
    }
}

func fileHandler(conn net.Conn) {

    buf := make([]byte, 0)
    buf = append(buf, '\x00')
    conn.Write(buf)
    absPath, _ := filepath.Abs("./progs.csv")

    file, err := os.Open(absPath)
    defer file.Close()

    fi, err := file.Stat()
    if err != nil {
        fmt.Println("Fatal error reading file: ", err)
    }

    fmt.Println("This is the length of the file: ", fi.Size())

    data := &DataPack{Length: fi.Size()} // , Contents: }

    data.Contents = make([]byte, data.Length)
    n, err := file.Read(data.Contents)
    if err != nil {
        fmt.Println("error reading contents into struct: ", err)
    }
    fmt.Println("tried to read file contents: ", n)
    fmt.Println("DataPack: %+v", data) 

    buf1 := new(bytes.Buffer)
    err = binary.Write(buf1, binary.BigEndian, &data)

    if err != nil {
        fmt.Println("Error writing binary buffer to big endian ", err)
    }
    conn.Write(buf1.Bytes())  
}

这是客户端

package main

import (
    "log"
    "fmt"
    "net"
    "strings"
    "strconv"
    "bufio"
)

const (
    host = "127.0.0.1"
    port = 23
)

func main() {

addr := strings.Join([]string{host, strconv.Itoa(port)}, ":")
client := NewClient()
var err error

client.socket, err = net.Dial("tcp", addr)
if err != nil {
    log.Println("error setting up socket: %s", err)
}

for {

    m := bufio.NewReader(client.socket)
    b, err := m.ReadByte()
    if err != nil {

        fmt.Println("here is the error: ", err)
    }
    if b == '\x00'{
        fmt.Println("about to receive a file!!!")
        b, _ := m.ReadByte()
        fmt.Println("just got another byte ", b )
    }

} 

log.Printf("Over")

最佳答案

为什么会报错

访问https://golang.org/pkg/encoding/binary/#Write

Write writes the binary representation of data into w. Data must be a fixed-size value or a slice of fixed-size values, or a pointer to such data.

类型数据包结构{ 长度 int64 内容[]字节 }

Contents 不是固定大小的值,因此您遇到了无效类型错误。

如何解决

  1. 二进制
  2. json
  3. 其他

关于go - 向客户端发送 CSV 文件服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715813/

相关文章:

go - 如何正确使用sync.Cond?

使用 RE2 的正则表达式在空格之前匹配字符串之后

go - 为什么 io.Copy 会引发 NetworkIdleTimeout 错误?

go - 此错误处理的工作方式。 CSV文件读写盒

http - 在 Go 中跟踪 HTTP 请求时指定超时

amazon-web-services - 尽管所有打开的安全组都无法从本地计算机中的 SQL 工作台访问 AWS redshift (EC2-classic)

c++ - 带有 async_read 的 boost.asio 多线程 I/O 服务器

c# - 64kB发送后TCP套接字是否会自动关闭?

c# - .net Tcp 服务器每隔几分钟接收一次大块字节

sql-server - SSIS OLEDB 连接管理器 - 无法连接到数据库(未显示数据库名称)