go - 发送 ISO8583 消息 Golang

标签 go iso8583

我正在尝试使用 Golang 构建 ISO8583 客户端, 使用java时,我在创建客户端时没有任何问题。 但是当尝试使用 golang 创建客户端时(顺便说一句,我刚刚开始学习 golang),我无法向服务器发送消息。谁能帮帮我,为什么我不能发消息?

我已尝试发送 SIGN IN 消息,客户端和服务器已连接,但服务器无法读取我发送的消息。

这是我的代码

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
    "time"
    "github.com/ideazxy/iso8583"
)

type ISOSignIn struct {
    Bit3 *iso8583.Numeric `field:"3" length:"6" encode:"bcd"`
    Bit7 *iso8583.Numeric `field:"7" length:"10" encode:"ascii`
    Bit11 *iso8583.Numeric `field:"11" length:"6" encode:"rbcd`
    Bit32 *iso8583.Llnumeric `field:"32" length:"11" encode:"ascii`
    Bit70 *iso8583.Numeric `field:"70" length:"3" encode:"ascii`
}

func main() {
    testIso()
}

func testIso() {
    data := ISOSignIn{
            Bit3: iso8583.NewNumeric("001111"),
            Bit7: iso8583.NewNumeric("0913110004"),
            Bit11: iso8583.NewNumeric("000001"),
            Bit32: iso8583.NewLlnumeric("9999"), // Client ID
            Bit70: iso8583.NewNumeric("301"), // Login Code
    }
    msg := iso8583.NewMessage("0800", data)
    msg.MtiEncode = iso8583.BCD
    b, err := msg.Bytes()
    if err != nil {
            fmt.Println(err.Error())
    }
    fmt.Printf("% x\n", b)
    tcpClientNew(b)
}

func tcpClientNew(b []byte) {
    tcpAddr, err := net.ResolveTCPAddr("tcp", "192.168.100.5:12346")
    if err != nil {
            println("ResolveTCPAddr failed:", err.Error())
            os.Exit(1)
    }
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    if err != nil {
            println("Dial failed:", err.Error())
            os.Exit(1)
    }
    timeoutDuration := 30 * time.Second
    _, err = conn.Write(b)
    if err != nil {
            println("Write to server failed:", err.Error())
            os.Exit(1)
    }
    conn.SetReadDeadline(time.Now().Add(timeoutDuration))
    bufReader := bufio.NewReader(conn)
    resp, _ := bufReader.ReadByte()
    fmt.Print("Message from server: " + string(resp))
    conn.Close()
}

服务器已经连接

<log realm="Server-A.server.session/192.168.100.1:32218" at="Mon Jan 07 09:37:15.747 WIB 2019">
  <session-start/>
</log>
<log realm="channel/192.168.100.1:32218" at="Mon Jan 07 09:37:19.034 WIB 2019" lifespan="3287ms">
  <receive>
    <peer-disconnect/>
  </receive>
</log>
<log realm="Server-A.server.session/192.168.100.1:32218" at="Mon Jan 07 09:37:19.035 WIB 2019">
  <session-end/>
</log>

客户端输出:

GOROOT=/Users/ivanaribanilia/Applications/go
GOPATH=/Users/ivanaribanilia/Project/Workspace-Github/Project-Go/pclient
/Users/ivanaribanilia/Applications/go/bin/go build -i -o /Users/ivanaribanilia/Project/Workspace-Github/Project-Go/pclient/build/pclient /Users/ivanaribanilia/Project/Workspace-Github/Project-Go/pclient/src/github.com/ivanj4u/pclient/main.go
/Users/ivanaribanilia/Project/Workspace-Github/Project-Go/pclient/build/pclient
08 00 22 20 00 01 00 00 00 00 00 11 11 30 39 31 33 31 31 30 30 30 34 30 30 30 30 30 31 30 34 31 31 31 34
Message from server: 
Process finished with exit code 0

我期待服务器的响应,因此我可以开发其他消息,如查询或付​​款。 谢谢

最佳答案

ReadByte reads and returns a single byte. If no byte is available, returns an error.

您从服务器读取的内容似乎只有一个字节,是一个空白字符。

服务器和客户端应该在关闭连接时做出协议(protocol)。因此,如果服务器不主动关闭连接,客户端应该从服务器读取所有字节并关闭连接。像这样:

recvBuf := make([]byte, 1024)
n, err := bufReader.Read(recvBuf)
for err == nil {
    println("Recv data from server:", string(recvBuf[:n]))
    n, err = bufReader.Read(recvBuf)
}
if err != io.EOF {
    println("recv from server failed, err:", err)
}
conn.Close()

或者如果协议(protocol)定义客户端在收到某个字节时应该关闭连接,客户端可以使用ReadBytes()主动关闭连接。

func (b *Reader) ReadBytes(delim byte) ([]byte, error)

ReadBytes reads until the first occurrence of delim in the input, returning a slice containing the data up to and including the delimiter. If ReadBytes encounters an error before finding a delimiter, it returns the data read before the error and the error itself (often io.EOF). ReadBytes returns err != nil if and only if the returned data does not end in delim.

关于go - 发送 ISO8583 消息 Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067962/

相关文章:

iso8583 - J8583 Api 和 EMV 凭证

go - 仅从 slice 中获取初始化的内容

java - j8583 库 - 如何将值转换为十六进制

iso8583 - ISO 8583 授权消息说明

docker - 容器中的 Go API 不返回任何响应

java - j8583:ISOMessage 解析器未按预期生成输出

java - JPOS ISO 8583 解析问题

go - 是否可以将 Type 存储在 map 中,稍后使用它在 Go lang 中实例化对象?

user-input - 捕获间隔的用户输入

go - 如何在 Golang 中为 cmd 工具编写基准测试?