【问题标题】:Send ISO8583 Message Golang发送 ISO8583 消息 Golang
【发布时间】:2019-06-01 17:43:34
【问题描述】:

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

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

这是我的代码

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

我希望得到服务器的响应,因此我可以开发其他消息,例如 INQUIRY 或 PAYMENT。 谢谢

【问题讨论】:

  • 你能发布客户端的输出吗?
  • 已经用输出客户端编辑帖子

标签: go iso8583


【解决方案1】:

ReadByte 读取并返回单个字节。如果没有可用的字节, 返回错误。

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

服务器和客户端应该在何时关闭连接时制定协议。因此,如果服务器没有主动关闭连接,客户端应该从服务器读取所有字节并关闭连接。像这样:

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()

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

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

ReadBytes 读取直到输入中第一次出现 delim, 返回一个包含数据的切片,直到并包括 分隔符。如果 ReadBytes 在找到一个 delimiter,它返回错误前读取的数据和错误 本身(通常是 io.EOF)。 ReadBytes 返回 err != nil 当且仅当 返回的数据不以分隔符结尾。

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2012-09-28
    • 2016-01-20
    • 2014-02-12
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多