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