C#中Socket的运用

原文网址:http://hi.baidu.com/eleven%5F2020/blog/item/8217de2e8a8c093a359bf763.html

 

C#中Socket的运用
2010-08-31 12:01

流的说明:数据的传输都会用到流,一般的文件如文本、图片等,可以运用FileStream类来完成。对象的传输也要转换成流,只不过我们称之为对象的序列化。所以不管是文件还是内存中的对象,要实现传输都会转换成有序列的二进制数组,然后在进行传输。
C#中可运用socket对象来完成计算机之间的数据传输。
发送数据主机:
1、创建socket对象
Socket   socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、远程IP和端口号
PEndPoint remotePoint = new IPEndPoint(IPAddress.Parse(远程IP), 8002);
3、连接远程主机
socketSend.Connect(remotePoint);
4、信息转换成字节数组
byte[] buff = System.Text.Encoding.Default.GetBytes(信息));
5、发送数据
socketSend.Send(buff);
6、关闭Socket
socketSend.Close();
接送数据主机
1、创建Socket对象
Socket socketListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、本机IP和端口号
IPEndPoint hostPoint = new IPEndPoint(Dns.GetHostEntry(Dns.GetHostName()).AddressList[0], 8002);
3、Socket绑定到该结点上
socketListen.Bind(hostPoint);
4、让Socket对象处于监听状态

socketListen.Listen(50);
5、建立连接请求
while (true)
{
     Socket socket = socketListen.Accept();//建立连接并返回连接的socket对象
     Thread thrAccept = new Thread(new ParameterizedThreadStart(DataProcess));
     thrAccept.Start(socket);//另一线程处理此次连接。这里也可以运用创建对象传参,线程执行对象的方法
}
6、处理数据
public void DataProcess(object obj)
{
      Socket socket = (Socket)obj;
      byte[] buff = new byte[1024];//创建缓存空间
      int len =socket.Receive(buff);//把接收的数据放入字节数组中
      string s = System.Text.Encoding.Default.GetString(buff, 0, len);
}

C#中Socket的运用(二)
2010-08-31 14:38

在做Socket编程时,我们一般会遇到以下问题:
1、如何判断发送方发送的是文字信息还是文件
可以先发送判断类型的字符串如:"MSG"或"FILE",再发送相关信息,另一方接送到后先解析类型,在处理接收到的信息。
发送发:
socketSend.Send(System.Text.Encoding.Default.GetBytes("MSG"));
Thread.Sleep(100);//这里一定要Sleep一会,不然接收到的可能有后面发送的信息
socketSend.Send(其他信息);
接收方:
byte[] buff = new byte[1024];
int len =socket.Receive(buff);//进行第一次Receive,获取类型字符串,若发送时没有Sleep一会,这里可能接送到所有信息,可通过截取字符串判断。
string type= System.Text.Encoding.Default.GetString(buff, 0, len);
if (type == "MSG")
{
   int mLen = socket.Receive(buff);//第二次Receive,则获取内容
    string msg = System.Text.Encoding.Default.GetString(buff, 0, mLen);
    MessageBox.Show(sb.ToString());
}
发送文件则是同样的原理。

2、传输大数据的处理
在进行数据传输时,我们会去创建临时的缓存区域,用于数据的读写,当传输大数据时,只需循环完成读写操作。
例如:传输大量文字信息
socketSend.Send(System.Text.Encoding.Default.GetBytes(大量信息));
接收方:
byte[] buff = new byte[1024];//创建缓存区域
int mLen = 0;
StringBuilder sb = new StringBuilder();
while ((mLen = socket.Receive(buff)) != 0)//循环读取数据
{

       sb.Append(System.Text.Encoding.Default.GetString(buff, 0, mLen));
}
MessageBox.Show(sb.ToString());

传输文件:
发送方
FileStream fs = new FileStream(this.cOrPath, FileMode.Open, FileAccess.Read);//文件流
byte[] buff = new byte[1024];//发送数据的缓存区域
int len;
while ((len = fs.Read(buff, 0,1024)) != 0)//循环把数据读入数组中
{
      socketSend.Send(buff, len, SocketFlags.None);//读一次发送一次
}
fs.Close();//发送完关闭文件流
Thread.Sleep(100);
string end = "END";//表示发送完
socketSend.Send(System.Text.Encoding.Default.GetBytes(end));
socketSend.Close();
接收方:
//创建写入文件流
FileStream fs = new FileStream("d://" + fileName, FileMode.OpenOrCreate, FileAccess.Write);
int mLen = 0;
while ((mLen = socket.Receive(buff)) != 0)//循环读取
{                    
      string end = System.Text.Encoding.Default.GetString(buff, 0, mLen);
      if (end == "END")//判断是否结束
      {
          break;
      }
      fs.Write(buff, 0, mLen);//读一次写一次
}
fs.Close();
MessageBox.Show("文件传输完成");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值