2012-11-02 43 views
1

我想在C#中使用XML文件將DataTable從服務器發送到客戶端。我已經在服務器端使用下面的代碼C#中的數據集和網絡流#

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塊和必要的變量已經宣佈.. PLZ回覆..

+8

你會得到什麼錯誤? – SLaks

+0

包括你的堆棧跟蹤也會有所幫助 – AntLaC

+0

你只是試圖發送模式,還是實際嘗試發送整個數據集?你的網絡流設置如何?在嘗試讀取XML之前,您是否正在閱讀整個流? – iMortalitySX

回答

0

我不知道我是看到你所有的代碼,但這裏是我會做什麼的一個例子,如果我HAD使用TcpSockets而不是WCF。

服務器端

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套接字,它仍然可以與Java一起工作,只要它是SOAP標準(有一些功能比如可靠消息傳遞,這些功能與其他任何東西都不兼容。淨)。

+0

謝謝你,我明白你的答案 –