Vengo oggi perché sono bloccato e non mi sembra logico.
Ho il mio server (Partire) e l'app per smartphone (Xamarin C #).
Per il lato Xamarin, sto usando questo pacchetto -> Plugin Sockets per Xamarin e Windows (PCL)
Per il lato Go, sto usando codifica / json
Tutto nella parte Xamarin funziona correttamente. Ma nel lato Go, non funziona. Sto usando il seguente codice per gestire i messaggi di ciascuno net.Conn.
type DialMessageContainer struct {
Type string `json:"Type"`
Content json.RawMessage `json:"Content"`
}
func (dialTCP *DialTCP) serve_conn(conn net.Conn) {
fmt.Println("Handle new connection.")
dec := json.NewDecoder(conn)
var message m.DialMessageContainer
//Use one of the following
printContent(conn)
// --
err := dec.Decode(&message)
fmt.Println(message, err)
//End
conn.Close()
}
func printContent(conn net.Conn) {
var buf bytes.Buffer
io.Copy(&buf, conn)
fmt.Println(buf.String())
}
Quindi, il tipo è qui per fargli sapere quale tipo dijson lo è. Da questo tipo di stringa, quindi rimuove un json dal contenuto json.RawmMessage all'oggetto buono. So che funziona, tuttavia quando provo a ricreare il mio oggetto dal seguente json, ottengo questo errore:
(printContent non commentato, quindi Decode non ha nulla da leggere, è per il test della traccia di debug)
....
Handle new connection.
{
"Type": "Authentication",
"Content": {
"UUID": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im1heGltZS1ndWl0dGV0QG91dGxvb2suY29tIiwiZXhwIjoxNDYyNjM4MTkzfQ.DEGJcDYl9Iq4nayo37Rq9ZsK8mrU-V8gU5I8JLO8oLg"
}
}
{ []} EOF
Così, quando nascondo la stampa Contenuto (conn), il dec.Decode fornisce questo:
....
Handle new connection.
{ []} invalid character "x00" looking for beginning of object key string
La cosa che mi chiedo è:"X00 indica il CARATTERE NULL della tabella ascii?". Se questo errore è dovuto a questo carattere, dov'è? Inoltre, se è questo carattere, forse è presente solo per contrassegnare il punto finale della stringa (utilizzare "" in C per contrassegnare la fine di un carattere * / char []).
Ma forse mi sbaglio completamente .. Onestamente sono bloccato e non capisco .. Aynway, JSONLint dice che è un JSON valido quindi può essere solo qualcosa sulla lettura che penso
Se qualcuno può aiutare, grazie!
risposte:
2 per risposta № 1Il tuo printConn
legge il messaggio, quindi dec.Decode(&message)
non ha niente da leggere.
0 per risposta № 2
Ho scoperto qual era il problema ...
Per scambiare messaggi tra il mio server / client utilizzo il modulo JSON.
Il server sta arrivando Partire e usa il encoding/json
pacchetto.
Il cliente è un Applicazione modulo Xamarin in C # e usi Newtonsoft.json
pacchetto.
Una volta serializzato, un JSON assume la forma di una stringa. Tuttavia per scrivere / leggere tra client / server, deve essere formattato come byte (C #byte[]
&& Partire[]byte
), quindi dobbiamo convertire il file jsonString
in una matrice di byte.
Dai un'occhiata a questa conversione con il mio Pseudo Emixam23
:
// C#
Emixam23 == [69][0][109][0][105][0][120][0][97][0][109][0][50][0][51][0]
// Go
Emixam23 == [69][109][105][120][97][109][50][51]
I due array rappresentano l'array di byte per la nostra stringa Emixam23, tuttavia, sono differenti. Come puoi vedere, abbiamo un file [0]
per la parte C #, a differenza della parte Go. Questo [0]
è il segno del byte a sinistra.
Un byte che è uguale a 0 significa " "
e poi, la fine di una stringa per una lingua come C. Penso che Go funzioni allo stesso modo. Se ho ragione allora l'errore è logico, quando json.Decode() //go
itera sul mio array di byte, quindi va alla fine che è " "
. Quindi la decodifica si ferma al secondo caso del mio array di byte e prova a creare un JSON con questa stringa "{"
che è un JSON non valido.
Ovviamente, fa lo stesso per la parte C #. Ho quindi creato queste due funzioni che sign()
e unsign()
un array di byte.
// for both, bytes[] is the byte array you want to convert and
// the lenght of this byte array when you call the function
public byte[] UnsignByteArray(byte[] bytes, int lenght)
{
int index = 0;
int i = 0;
var array = new byte[lenght / 2];
while (index < lenght)
{
array[i] = bytes[index];
index += 2;
i++;
}
return array;
}
public byte[] SignByteArray(byte[] bytes, int lenght)
{
int index = 0;
int i = 0;
var array = new byte[lenght * 2];
while (index < lenght)
{
array[i] = bytes[index];
i++;
index++;
array[i] = 0;
i++;
}
return array;
}
Non dimenticare mai di dare un'occhiata con Debug / Stampa tutti i dati per entrambi i lati, può aiutare!