Отправить ISO8583 сообщение Golang - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать клиент ISO8583, используя Golang, при использовании Java у меня нет никаких проблем при создании клиента. Но когда я пытаюсь создать клиента с помощью golang (я только начинаю изучать golang), я не могу отправить сообщение на сервер. Может ли кто-нибудь помочь мне, почему я не могу отправить сообщение?

Я пытался отправить сообщение о входе в систему. Клиент и сервер уже подключены, но сообщение, которое я отправляю, не читается сервером.

Это мой код

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

Я ожидаю ответа от сервера, поэтому могу разработать другое сообщение, например, ЗАПРОС или ОПЛАТА. Спасибо

1 Ответ

0 голосов
/ 07 января 2019

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 (байт-разделитель) ([] байт, ошибка)

ReadBytes читает до первого появления delim во входных данных, возвращая срез, содержащий данные до разделитель. Если ReadBytes обнаружит ошибку перед поиском разделитель, он возвращает данные, прочитанные до ошибки и ошибки сам (часто io.EOF). ReadBytes возвращает err! = Nil тогда и только тогда, когда возвращенные данные не заканчиваются разделителем.

...