使用Socket传字符串和DataSet

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文原创,转载注明地址。

需要引用命名空间:

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模式下都可以用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值