1

C# で XML ファイルを使用して、サーバーからクライアントに DataTable を送信したいと考えています。サーバー側で次のコードを使用しました

DataSet ds = new DataSet();
ds.WriteXml(nw, XmlWriteMode.WriteSchema);

ここで、nw はサーバーの NetworkStream です

次のコードはクライアント側にあります

DataSet ds = new DataSet();
ds.ReadXml(clientSockStream, XmlReadMode.ReadSchema);

サーバーはデータを送信していますが、クライアント側でプログラムが停止します。サーバ側:

tcpserver = new TcpListener(IPAddress.Any, 4444);
tcpserver.Start();
Socket serverSocket = tcpserver.AcceptSocket(); // accepting connection
    if (serverSocket.Connected)
    {
        serversockstream = new NetworkStream(serverSocket);
        serverStreamReader = new StreamReader(serversockstream);
        serverStreamWriter = new StreamWriter(serversockstream);
        handleClinet client = new handleClinet(); 
        client.startClient(serverStreamReader, serversockstream,serverStreamWriter);
    }

    public void startClient(StreamReader streamReader, NetworkStream ser, StreamWriter streamWriter)
    {
        this.sread = streamReader;
        this.swrite = streamWriter;
        this.nwstram = ser;
        Thread ctThread = new Thread(handleClients);
        ctThread.Start();
    }

    private void handleClients()
    {
        // Creating Dummy DataTable to send to Client...
        DataSet ds = new DataSet();
        DataTable d = new DataTable();
        d.Columns.Add("Name");
        d.Columns.Add("City");
        d.Rows.Add("John","USA");

        ds.Tables.Add(d);

        try
        {    

            while ((true))
            {
                String mystr = sread.ReadLine();
                if (mystr.Equals("sendTable"))
                    break;
            }
            swrite.WriteLine("done");
            swrite.Flush();
            if(nwstram.CanWrite)
            {
                MessageBox.Show("it can write...");
                ds.WriteXml(nwstram, XmlWriteMode.IgnoreSchema);
            }
            nwstram.Flush();
            MessageBox.Show("XML Sent");

        }

クライアント側:

    tcpClient = new TcpClient("127.0.0.1", 4444);

    IPHostEntry ip = Dns.GetHostEntry("127.0.0.1");
    //get a network stream from server
    clientSockStream = tcpClient.GetStream();
    clientStreamReader = new StreamReader(clientSockStream);
    clientStreamWriter = new StreamWriter(clientSockStream);

    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            clientStreamWriter.WriteLine("sendTable");
            clientStreamWriter.Flush();
            DataSet ds = new DataSet();
            String str = "";
            while (true)
            {
                str = clientStreamReader.ReadLine();
                if (str.Equals("done"))
                    break;

            }
            //MessageBox.Show("Client :" + str);
            if (clientSockStream.CanRead)
            {
                ds.ReadXml(clientSockStream, XmlReadMode.IgnoreSchema);
            }
        }
        dataGridView1.DataSource = ds.Tables[0];
    }

すべての catch ブロックと必要な変数が宣言されていると仮定します..返信してください..

4

1 に答える 1

0

あなたのすべてのコードを見ているかどうかはわかりませんが、WCF の代わりに TcpSockets を使用しなければならなかった場合の例を次に示します。

サーバ側

public void StartServer()
{
    TcpListener listener = null;
    TcpClient client = null;
    NetworkStream nwStream = null; 

    try
    {
        listener = new TcpListener(IPAddress.Any, 4444);
        listener.Start();
    }
    catch(Exception ex)
    { Console.WriteLine(ex.Message); }

    byte[] buffer = new byte[1024];

    try
    {
        bool waiting = true;

        while(waiting)
        {
            if(listener.Pending())
            {

                client = listener.AcceptTcpClient();
                nwStream = client.GetStream();

                using(var ms = new MemoryStream())
                {
                    CreateDataSet().WriteXml(ms);
                    ms.Position = 0;

                    int read = 0;
                    while((read = ms.Read(buffer, 0, 1024)) != 0)
                    {
                        nwStream.Write(buffer, 0, read);
                    }
                }
                nwStream.Flush();
                nwStream.Close();
                client.Close();
                waiting = false;
            }
        }
    }
    catch(Exception ex)
    {
       Console.WriteLine(ex.Message);
    }
}

private DataSet CreateDataSet()
{
    //Create your dataset here and return something
}

クライアント側

public DataSet GetDataSet()
{
    DataSet ds = new DataSet();
    TCPClient client = null;
    NetworkStream nwStream = null;

    try
    {
        client = new TcpClient("127.0.0.1", 4444);
        nwStream = client.GetStream();

        using(var ms = new MemoryStream())
        {
            byte[] buffer = new byte[1024];
            int read = 0;
            while((read = nwStream.Read(buffer, 0, 1024)) != 0)
            {
                ms.Write(buffer, 0, read);
            }
            ms.Position = 0;

            ds.ReadXml(ms);
        }
    }
    finally
    {
        nwStream.Close();
        client.Close();
    }

    return ds;
}

これが思い通りに機能するとは言いませんが、いくつかの変更を加えると、良いスタートになるはずです。ただし、WCF を調べることを強くお勧めします (私は大きな支持者です)。これは、いくつかのコードで同じサービスのフレームワークを示しているためです。

WCF サーバー側

[ServiceContract]
public interface IDataService
{
    [OperationContract]
    DataSet GetData();
}

public class DataService: IDataService
{
    public DataSet GetData()
    {
        //return some dataset here
    }
}

WCF クライアント側

private DataSet GetDataSet()
{
    DataSet ds;

    //This would be utilizing some gerated code, or you can make your own client
    var client = new DataServiceClient(someEndPoint, someBinding);
    client.Open();

    ds = client.GetData();

    client.Close();
    return ds;
}

繰り返しますが、これは完全に機能するコードではありませんが、WCF がソケットを介して独自のクレイジーなコードを作成するよりも人気がある理由のサンプルにすぎません。中立的な言語を維持したい場合は、代わりに http ソケットにアップグレードすることもできます。それは、SOAP 標準である限り、Java で引き続き動作します (.ネット)。

于 2012-11-05T15:02:01.920 に答える