Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向Golang中的TCP服务器发送整数?_Go_Tcp - Fatal编程技术网

如何向Golang中的TCP服务器发送整数?

如何向Golang中的TCP服务器发送整数?,go,tcp,Go,Tcp,我的Go中有以下客户端和服务器: 客户: package main import ( "bytes" "encoding/binary" "fmt" "io" "net" ) func main() { var num1 int buf := new(bytes.Buffer) fmt.Scanln(&num1) fmt.Printf(&q

我的Go中有以下客户端和服务器:

客户:

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
    "io"
    "net"
)

func main() {

var num1 int
buf := new(bytes.Buffer)

fmt.Scanln(&num1)

fmt.Printf("I'm the client, your input was the number: %d", num1)

//escribir el numero a b, el buffer
err := binary.Write(buf, binary.LittleEndian, num1)

//Llama al server
conn, err := net.Dial("tcp", "localhost:9000")
if err != nil {
    panic(err)
}

//Escribe buffer a la conexion
buf.WriteTo(conn)

//Cierra la conexión
defer conn.Close()

//Lee la conexión  y la imprime
bs, _ := io.ReadAll(conn)
fmt.Println(string(bs))
}
服务器:

package main

import (
    "encoding/binary"
    "fmt"
    "io"
    "net"
)

func main() {
//Escuchar un request
ln, err := net.Listen("tcp", ":9000")
if err != nil {
    panic(err)
}

defer ln.Close()
var num int

for {

    //Recibir un request
    conn, err := ln.Accept()
    if err != nil {
        panic(err)
    }

    err = binary.Read(conn, binary.LittleEndian, &num)

    io.WriteString(conn, fmt.Sprintf("I'm the server, the number I received is: ", num))

    conn.Close()
}
}
我的服务器正在发回消息,但显然它接收到的是0,而不是用户输入的数字。看起来这应该是一件简单的事情,但我想不出来

我不确定我是否在尝试正确的实现来实现这一点。有更好的办法吗?如果没有,为什么我的服务器没有正确接收int?

总是处理错误

调用
binary.Read(conn,binary.LittleEndian,&num)
binary.Write(buf,binary.LittleEndian,num1)
返回一个错误,指出不支持
int
s

编码/二进制包使用固定大小的数字()。
int
的大小不是固定大小,因为大小取决于平台

在客户端中声明
num1
,在服务器中声明
num
,以使用固定大小的类型。例如,将两个声明都更改为
int32

向Sprintf调用添加格式谓词。我在此处添加%v:

io.WriteString(conn, fmt.Sprintf("I'm the server, the number I received is: %v", num))

.

谢谢!这是向TCP服务器发送数据的常用方法还是有更好的方法?@samuel amg二进制编码是通过TCP发送数据的常用方法。