本文原创,转载注明地址。
需要引用命名空间:
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Data.SqlClient;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; 写一个返回数据集的方法:
public DataSet Bind()
...{
Conn = new SqlConnection(sConnString);
SqlDataAdapter adapter = new SqlDataAdapter("select * from product", Conn);
Conn.Open();
DataSet ds = new DataSet();
adapter.Fill(ds);
Conn.Close();
return ds;
}接下来写DataSet转换二进制的方法(我写了两种方法):
public static byte[] DataToByte(DataSet ds)
...{
byte[] bArrayResult = null;
ds.RemotingFormat = SerializationFormat.Binary;
MemoryStream ms = new MemoryStream();
IFormatter bf = new BinaryFormatter();
bf.Serialize(ms, ds);
bArrayResult = ms.ToArray();
ms.Close();
ms.Dispose();
return bArrayResult;
}
public static DataSet ByteToDataset(byte[] bArrayResult)
...{
DataSet dsResult = null;
MemoryStream ms = new MemoryStream(bArrayResult);
IFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(ms);
dsResult = (DataSet)obj;
ms.Close();
ms.Dispose();
return dsResult;
}
public static byte[] GetBinaryFormatDataSet(DataSet ds)
...{
//创建内存流
MemoryStream memStream = new MemoryStream();
//产生二进制序列化格式
IFormatter formatter = new BinaryFormatter();
//指定DataSet串行化格式是二进制
ds.RemotingFormat = SerializationFormat.Binary;
//串行化到内存中
formatter.Serialize(memStream, ds);
//将DataSet转化成byte[]
byte[] binaryResult = memStream.ToArray();
//清空和释放内存流
memStream.Close();
memStream.Dispose();
return binaryResult;
}
public static DataSet RetrieveDataSet(byte[] binaryData)
...{
//创建内存流
MemoryStream memStream = new MemoryStream(binaryData);
memStream.Seek(0, SeekOrigin.Begin);
//产生二进制序列化格式
IFormatter formatter = new BinaryFormatter();
//反串行化到内存中
object obj = formatter.Deserialize(memStream);
//类型检验
if (obj is DataSet)
...{
DataSet dataSetResult = (DataSet)obj;
return dataSetResult;
}
else
...{
return null;
}
}写一个服务器端:
int port = 2008;
string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定2008端口
s.Listen(0);//开始监听
Console.WriteLine("Waitforconnect");
Socket temp = s.Accept();//为新建连接创建新的Socket。
Console.WriteLine("Getaconnect");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
string output = "hello!";//发送字符串的方法
byte[] hello = Encoding.ASCII.GetBytes(output);
s.Send(hello);
s.Close();
byte[] bs = DataToByte(Bind());//发送数据集的方法,Bind()是上面那个返回数据集的方法
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
temp.Close();
s.Close();客户端(代码有点乱但是意思到了):
int port = 2008
string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
//Console.WriteLine("Conneting...");
Response.Write("Conneting...");
c.Connect(ipe);//连接到服务器
string sendStr = "hello!Thisisasockettest";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
//Console.WriteLine("SendMessage");
Response.Write("SendMessage");
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024*1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
DataSet ds = RetrieveDataSet(recvBytes);
GridView1.DataSource = ds.Tables[0].DefaultView;
GridView1.DataBind();
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);//返回字符串
//Console.WriteLine("ClientGetMessage:{0}",recvStr);//显示服务器返回信息
Response.Write(recvStr);
c.Close();这样基本就实现了Scoket传递字符和DataSet了,BS和CS模式下都可以用的。

本文介绍了一种使用Socket进行DataSet二进制序列化传输的方法。包括数据集的获取、序列化为字节数组、通过Socket发送接收及反序列化过程。
1395

被折叠的 条评论
为什么被折叠?



