[英]DataSet & NetworkStream in C#
我想使用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块和必要的变量都已声明.. Plz答复。
我不确定我是否能看到您的所有代码,但这是一个示例,说明如果我不得不使用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标准,它就仍然可以与Java一起使用(诸如可靠消息传递之类的一些功能与不能兼容。净)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.