使用Socket传字符串和DataSet

43 篇文章 0 订阅
28 篇文章 0 订阅

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

需要引用命名空间:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值