简体   繁体   English

C#中的DataSet和NetworkStream

[英]DataSet & NetworkStream in C#

I want to sent DataTable from Server to Client using XML file in C#. 我想使用C#中的XML文件将DataTable从服务器发送到客户端。 I have used following code at server side 我在服务器端使用了以下代码

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

where nw is NetworkStream at Server 其中nw是服务器上的NetworkStream

and following code is at Client side 并且以下代码在客户端

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

The server is sending data but at client side the program gets halted. 服务器正在发送数据,但是在客户端程序被暂停。 Server Side: 服务器端:

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");

        }

Client Side: 客户端:

    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];
    }

Assume that all catch blocks and necessary variables have declared .. Plz reply.. 假定所有catch块和必要的变量都已声明.. Plz答复。

I'm not sure that I am seeing all of your code, but here is an example of what I would do if I HAD to use TcpSockets instead of WCF. 我不确定我是否能看到您的所有代码,但这是一个示例,说明如果我不得不使用TcpSockets而不是WCF,该怎么办。

SERVER SIDE 服务器端

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
}

CLIENT SIDE 客户端

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;
}

I wouldn't say that this will work exactly as you want, but with some modification that should be a good start. 我不会说这将完全按照您的要求工作,但是进行一些修改应该是一个好的开始。 However, I would highly suggest looking into WCF (I'm a huge propponent) because here is the framework of your same service in some code. 但是,我强烈建议您研究WCF(我是一个巨大的支持者),因为这是某些代码中相同服务的框架。

WCF SERVER SIDE WCF服务器端

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

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

WCF CLIENT SIDE 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;
}

Again, that is not totally working code, but is just a sample of why WCF is so popular over writing your own crazy through sockets. 再说一次,这并不是完全有效的代码,而仅仅是WCF为什么比通过套接字编写自己的疯狂代码如此受欢迎的一个示例。 If you are looking to stay language neutral, you could even upgrade to http sockets instead and it will still work with Java, so long as it is SOAP standard (there are a few features like reliable messaging that are not compatible with anything other than .NET). 如果您希望保持语言中立,甚至可以升级到http套接字,并且只要Java是SOAP标准,它就仍然可以与Java一起使用(诸如可靠消息传递之类的一些功能与不能兼容。净)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM