2012-11-02 2 views
1

C#의 XML 파일을 사용하여 서버에서 클라이언트로 DataTable을 보내려고합니다. 나는 서버 측에 다음 코드를 사용했습니다 NW이 서버C#의 DataSet 및 NetworkStream

에는 NetworkStream과 코드를 다음은 클라이언트 측에있다

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

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

+8

어떤 오류가 발생합니까? – SLaks

+0

스택 추적을 포함하면 도움이됩니다 – AntLaC

+0

스키마를 보내려고 하시겠습니까? 아니면 실제로 전체 데이터 세트를 보내시겠습니까? 네트워크 스트림을 어떻게 설정합니까? XML을 읽기 전에 전체 스트림에서 읽고 있습니까? – iMortalitySX

답변

0

나는 내가 모르겠어요 .. 가 Plz은 답장을 .. 모든 catch 블록 필요한 변수를 선언했다고 가정 모든 코드를 볼 수 있지만 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와도 계속 사용할 수 있습니다 (다른 메시 지와 호환되지 않는 안정적인 메시징과 같은 몇 가지 기능이 있습니다). 그물).

+0

고맙습니다. 나는 대답을 이해했습니다. –