本文原创,转载注明地址。
需要引用命名空间:
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模式下都可以用的。