Kesalahan Nilai heksadesimal 0x00 adalah karakter yang tidak valid saat mengirim data dalam format XML melalui LAN

Hai, saya cukup baru dalam pemrograman NET. Saya harus mengembangkan aplikasi di mana klien perlu mengakses server melalui LAN, dan menerima data dari database MS ACCESS jarak jauh. Komunikasi berhasil dan server mengirimkan tabel data dalam format XML. Namun ketika klien menerima string dan mencoba mengubahnya menjadi XML dan mengisi datagridview, itu memberikan kesalahan

"Nilai heksadesimal 0x00 adalah karakter yang tidak valid"

Bantuan apa pun untuk menyelesaikan masalah ini akan dihargai. Saya menggunakan pengkodean ASCII dan pengkodean UTF-8 tetapi keduanya tidak berhasil.

Ini adalah klien yang mengirimkan permintaan

    Dim client As New Net.Sockets.TcpClient
    Dim stream As NetworkStream = Nothing
    sql = "Select * from Roll "

    client.Connect("127.0.0.1", 3000)
    stream = client.GetStream
    Dim sendbytes() As Byte = Encoding.ASCII.GetBytes(sql)
    stream.Write(sendbytes, 0, sendbytes.Length)

Dan kemudian server menerimanya dan menjalankan query pada database dan mengirimkan datatable melalui koneksi LAN

        client = server.AcceptTcpClient
        stream = client.GetStream
        Dim rvcBytes(client.ReceiveBufferSize) As Byte
        stream.Read(rvcBytes, 0, client.ReceiveBufferSize)
        Dim recive As String = Encoding.ASCII.GetString(rvcBytes)


    Try 'lotNumberFrom & " and LotNumber " & lotNumberTo


        cmd = New OleDbCommand(recive, con)
        '  MsgBox(recive)
        ds.Clear()

        adapter.SelectCommand = cmd
        adapter.Fill(ds, "Batch data")

        Dim writer As New System.IO.StringWriter
        ds.Tables("Batch data").WriteXml(writer, True)

        ' MsgBox(writer.ToString)
        Dim sendbytes() As Byte = Encoding.ASCII.GetBytes(writer.ToString)
        stream.Write(sendbytes, 0, sendbytes.Length)





    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

Kemudian klien menerimanya dan mencoba mengisi datagridview. Di situlah masalahnya terjadi.

    Dim rvcBytes(client.ReceiveBufferSize) As Byte
    stream.Read(rvcBytes, 0, client.ReceiveBufferSize)
    Dim recive As String = Encoding.ASCII.GetString(rvcBytes)
    Dim dsa As New DataSet



    dsa.ReadXml(New XmlTextReader(New StringReader(recive)))
    DataGridView1.DataSource = dsa.Tables(0)

    client.Close()

person SameeraR    schedule 16.05.2013    source sumber
comment
Pertanyaan Anda kurang banyak - kami sama sekali tidak tahu bagaimana Anda mentransfer data, dan bagaimana Anda menerimanya. Mulailah dengan memberikan kode itu.   -  person Jesse    schedule 16.05.2013
comment
Maaf sekali. saya mengedit pertanyaannya   -  person SameeraR    schedule 16.05.2013


Jawaban (1)


Saya mulai dengan mencoba mengubah kode Anda, tetapi ketika mencari informasi saya menemukan beberapa contoh MSDN:

Contoh Soket Server Sinkron
http://msdn.microsoft.com/en-CA/library/6y0e13d3.aspx

Contoh Soket Klien Sinkron
http://msdn.microsoft.com/en-CA/library/kb5kfec7.aspx

Meminjam banyak dari itu, saya menemukan yang berikut ini. (Mereka dalam C#, tapi seharusnya tidak terlalu sulit untuk menerjemahkannya ke VB.NET.)

ACE_Server.exe adalah aplikasi konsol. Ia terus mendengarkan koneksi sampai Anda mematikannya dengan Ctrl+C:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SynchronousSocketListener
{
    // Incoming data from the client.
    public static string data = null;

    public static void StartListening()
    {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        IPHostEntry ipHostEntry = Dns.GetHostEntry("localhost");
        IPAddress ipAddress = ipHostEntry.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

        // Bind the socket to the local endpoint and 
        // listen for incoming connections.
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);

            // Start listening for connections.
            while (true)
            {
                Console.WriteLine("Waiting for a connection...");
                // Program is suspended while waiting for an incoming connection.
                Socket handler = listener.Accept();
                data = null;

                // An incoming connection needs to be processed.
                while (true)
                {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    if (data.IndexOf("<EOF>") > -1)
                    {
                        break;
                    }
                }

                // Show the data on the console.
                Console.WriteLine("Text received : {0}", data);

                // do the database stuff
                string sql = data.Substring(0, data.Length - 5);  // remove "<EOF>" terminator
                var con = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\testData.accdb;");
                var cmd = new System.Data.OleDb.OleDbCommand(sql, con);
                var adapter = new System.Data.OleDb.OleDbDataAdapter();
                adapter.SelectCommand = cmd;
                var ds = new System.Data.DataSet();
                adapter.Fill(ds, "Batch data");

                var sw = new System.IO.StringWriter();
                ds.Tables["Batch data"].WriteXml(sw, System.Data.XmlWriteMode.IgnoreSchema);

                // send the data back to the client.
                byte[] msg = Encoding.ASCII.GetBytes(sw.ToString());
                int bytesSent = handler.Send(msg);
                Console.WriteLine(bytesSent.ToString() + " bytes sent.");
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();

    }

    public static int Main(String[] args)
    {
        StartListening();
        return 0;
    }
}

ACE_Client.exe adalah aplikasi Windows Formulir. Perhatikan bahwa ini menambahkan "<EOF>" ke string SQL sehingga komponen server akan mengetahui kapan harus berhenti membaca:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;

namespace ACE_Client
{
    public partial class Form1 : Form
    {
        public static string data = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Data buffer for incoming data.
            byte[] bytes = new byte[1024];

            // Establish the remote endpoint for the socket.
            // This example uses port 11000 on the local computer.
            IPHostEntry ipHostEntry = Dns.GetHostEntry("localhost");
            IPAddress ipAddress = ipHostEntry.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

            // Create a TCP/IP  socket.
            Socket sock = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
            sock.Connect(remoteEP);

            string sql = "SELECT * FROM ExpenseDetails";
            byte[] msg = Encoding.ASCII.GetBytes(sql + "<EOF>");

            // Send the data through the socket.
            int bytesSent = sock.Send(msg);

            // Receive the response from the remote device.
            data = null;
            while (true)
            {
                bytes = new byte[1024];
                int bytesRec = sock.Receive(bytes);
                data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                if (data.IndexOf("</NewDataSet>") > -1)
                {
                    break;
                }
            }

            // Release the socket.
            sock.Shutdown(SocketShutdown.Both);
            sock.Close();

            var dsa = new DataSet();
            dsa.ReadXml(new System.Xml.XmlTextReader(new System.IO.StringReader(data)));
            dataGridView1.DataSource = dsa.Tables[0];
        }
    }
}
person Gord Thompson    schedule 16.05.2013
comment
Kode Anda berfungsi sebagai pesona. Tidak tahu bagaimana harus berterima kasih. Akhirnya berhasil. Terima kasih banyak telah mencurahkan waktu Anda untuk masalah ini. Bersulang.... - person SameeraR; 17.05.2013
comment
Bisakah Anda menjelaskan apa yang salah dengan kode awal? - person guival; 09.02.2017