• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#之Socket操作类实例解析

C#之Socket操作类实例解析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#socket通信实例,c#socket编程实例,c#socket实例,c#socket异步通信实例,c#socket类等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文展示了一个C#的Socket操作类的完整实例,并附带了用法说明,分享给大家供大家参考之用。具体方法如下:

主要功能代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Collections;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections.Specialized;
using System.Threading;
public class DuxSocketClient
{
 #region 私有字段
 /// <summary>
 /// 设置数据缓冲区大小 默认1024
 /// </summary>
 private static int m_maxpacket = 1024 * 4;
 public delegate void SendFileProgress(int progress);
 public delegate void ReceiveFileProgress(int progress);
 #endregion
 #region 服务器侦听
 /// <summary>
 /// 服务器侦听方法 返回null则说明没有链接上
 /// </summary>
 /// <returns>返回一个套接字(Socket)</returns>
 public static Socket ListenerSocket(TcpListener listener)
 {
  try
  {
   Socket socket = listener.AcceptSocket();
   return socket;
  }
  catch
  {
   return null;
  }
 }
 /// <summary>
 /// 服务器侦听方法 返回null则说明没有链接上
 /// </summary>
 /// <param name="listener"></param>
 /// <returns>返回一个网络流</returns>
 public static NetworkStream ListenerStream(TcpListener listener)
 {
  try
  {
   TcpClient client = listener.AcceptTcpClient();
   return client.GetStream();
  }
  catch
  {
   return null;
  }
 }
 #endregion
 #region 客户端连接
 public static Socket ConnectSocket(TcpClient tcpclient, IPEndPoint ipendpoint)
 {
  try
  {
   tcpclient.Connect(ipendpoint);
   return tcpclient.Client;
  }
  catch
  {
   return null;
  }
 }
 public static Socket ConnectSocket(TcpClient tcpclient, IPAddress ipadd, int port)
 {
  try
  {
   tcpclient.Connect(ipadd, port);
   return tcpclient.Client;
  }
  catch
  {
   return null;
  }
 }
 public static NetworkStream ConnectStream(TcpClient tcpclient, IPEndPoint ipendpoint)
 {
  try
  {
   tcpclient.Connect(ipendpoint);
   return tcpclient.GetStream();
  }
  catch
  {
   return null;
  }
 }
 public static NetworkStream ConnectStream(TcpClient tcpclient, IPAddress ipadd, int port)
 {
  try
  {
   tcpclient.Connect(ipadd, port);
   return tcpclient.GetStream();
  }
  catch
  {
   return null;
  }
 }
 #endregion
 #region Socket接收数据
 /// <summary>
 /// 接受固定长度字符串
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="size"></param>
 /// <returns></returns>
 public static byte[] ReceiveFixData(Socket socket, int size)
 {
  int offset = 0;
  int recv = 0;
  int dataleft = size;
  byte[] msg = new byte[size];
  while (dataleft > 0)
  {
   recv = socket.Receive(msg, offset, dataleft, 0);
   if (recv == 0)
   {
    break;
   }
   offset += recv;
   dataleft -= recv;
  }
  return msg;
 }
 /// <summary>
 /// 接收变长字符串
 /// 为了处理粘包问题 ,每次发送数据时 包头(数据字节长度) + 正文
 /// 这个发送小数据
 /// 设置包头的字节为8,不能超过8位数的字节数组
 /// </summary>
 /// <param name="socket"></param>
 /// <returns>byte[]数组</returns>
 public static byte[] ReceiveVarData(Socket socket)
 {
  //每次接受数据时,接收固定长度的包头,包头长度为8
  byte[] lengthbyte = ReceiveFixData(socket, 8);
  //length得到字符长度 然后加工处理得到数字
  int length = GetPacketLength(lengthbyte);
  //得到正文
  return ReceiveFixData(socket, length);  
 }
 /// <summary>
 /// 接收T类对象,反序列化
 /// </summary>
 /// <typeparam name="T">接收T类对象,T类必须是一个可序列化类</typeparam>
 /// <param name="socket"></param>
 /// <returns></returns>
 public static T ReceiveVarData<T>(Socket socket)
 {
  //先接收包头长度 固定8个字节
  byte[] lengthbyte = ReceiveFixData(socket, 8);
  //得到字节长度
  int length = GetPacketLength(lengthbyte);
  byte[] bytecoll = new byte[m_maxpacket];
  IFormatter format = new BinaryFormatter();
  MemoryStream stream = new MemoryStream();
  int offset = 0; //接收字节个数
  int lastdata = length; //还剩下多少没有接收,初始大小等于实际大小
  int receivedata = m_maxpacket; //每次接收大小
  //循环接收
  int mark = 0; //标记几次接收到的数据为0长度
  while (true)
  {
   //剩下的字节数是否小于缓存大小
   if (lastdata < m_maxpacket) 
   {
    receivedata = lastdata; //就只接收剩下的字节数
   }
   int count = socket.Receive(bytecoll,0,receivedata,0);
   if (count > 0)
   {
    stream.Write(bytecoll, 0, count);
    offset += count;
    lastdata -= count;
    mark = 0;
   }
   else
   {
    mark++;
    if (mark == 10)
    {
     break;
    }
   }
   if (offset == length)
   {
    break;
   }
  }
  stream.Seek(0, SeekOrigin.Begin); //必须要这个 或者stream.Position = 0;
  T t = (T)format.Deserialize(stream);
  stream.Close();
  return t;
 }
 /// <summary>
 /// 在预先得到文件的文件名和大小
 /// 调用此方法接收文件
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="path">路径必须存在</param>
 public static bool ReceiveFile(Socket socket, string path, string filename, long size,ReceiveFileProgress progress)
 {
  bool ret = false;
  if (Directory.Exists(path))
  {
   //主要是防止有重名文件
   string savepath = GetPath(path, filename); //得到文件路径
   //缓冲区
   byte[] file = new byte[m_maxpacket];
   int count = 0; //每次接收的实际长度
   int receivedata = m_maxpacket; //每次要接收的长度
   long offset = 0; //循环接收的总长度
   long lastdata = size; //剩余多少还没接收
   int mark = 0;
   using (FileStream fs = new FileStream(savepath, FileMode.OpenOrCreate, FileAccess.Write))
   {
    if (size > 0)
    {
     while (true)
     {
      if (lastdata < receivedata)
      {
       receivedata = Convert.ToInt32(lastdata);
      }
      count = socket.Receive(file, 0, receivedata, SocketFlags.None);
      if (count > 0)
      {
       fs.Write(file, 0, count);
       offset += count;
       lastdata -= count;
       mark = 0;
      }
      else
      {
       mark++; //连续5次接收为0字节 则跳出循环
       if (mark ==10)
       {
        break;
       }
      }
      //接收进度
      if (progress != null)
      {
       progress(Convert.ToInt32(((Convert.ToDouble(offset) / Convert.ToDouble(size)) * 100)));
      }
      //接收完毕
      if (offset == size)
      {
       ret = true;
       break;
      }
     }
    }
    fs.Close();
   }
  }
  return ret;
 }
 public static bool ReceiveFile(Socket socket, string path, string filename, long size)
 {
  return ReceiveFile(socket, path, filename, size,null);
 }
 /// <summary>
 /// 预先不知道文件名和文件大小 用此方法接收
 /// 此方法对于的发送方法是SendFile()
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="path">要保存的目录</param>
 public static void ReceiveFile(Socket socket, string path)
 {
  //得到包头信息字节数组 (文件名 + 文件大小 的字符串长度)
  //取前8位
  byte[] info_bt = ReceiveFixData(socket, 8);
  //得到包头信息字符长度
  int info_length = GetPacketLength(info_bt);
  //提取包头信息,(文件名 + 文件大小 的字符串长度)
  byte[] info = ReceiveFixData(socket, info_length);
  //得到文件信息字符串 (文件名 + 文件大小)
  string info_str = System.Text.Encoding.UTF8.GetString(info);
  string[] strs = info_str.Split('|');
  string filename = strs[0]; //文件名
  long length = Convert.ToInt64(strs[1]); //文件大小
  //开始接收文件
  ReceiveFile(socket, path, filename, length);
 }
 private static int GetPacketLength(byte[] length)
 {
  string str = System.Text.Encoding.UTF8.GetString(length);
  str = str.TrimEnd('*'); ;//("



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#使用Socket快速判断数据库连接是否正常的方法
  • C#选择法排序实例分析
  • C#使用Socket上传并保存图片的方法
  • C#使用动态规划解决0-1背包问题实例分析
  • C#使用Socket实现发送和接收图片的方法
  • C#插入法排序算法实例分析
  • C#中异步Socket通信编程代码实例
  • C#中FormsAuthentication用法实例
  • C# Socket网络编程实例
  • C#使用Socket发送和接收TCP数据实例

相关文章

  • 2017-05-28读写XML文件的内容并将其显示在ListView控件上的方法
  • 2017-05-28MessageBox的Buttons和三级联动效果
  • 2017-05-28C#探秘系列(一)——ToDictionary,ToLookup
  • 2017-05-28C#使用LINQ中Enumerable类方法的延迟与立即执行的控制
  • 2017-05-28C#中File类的文件操作方法详解
  • 2017-05-28C#数据结构与算法揭秘一
  • 2017-05-28C#通过指针实现快速拷贝的方法
  • 2017-05-28C#中使用JSON.NET实现JSON、XML相互转换
  • 2017-05-28C#实现关闭子窗口而不释放子窗口对象的方法
  • 2017-05-28C#生成Word文档代码示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C# 多网卡 Server Listen
    • C#解析json字符串总是多出双引号的原因分析及解决办法
    • C#实现鼠标移动到曲线图上显示值的方法
    • c# asp .net 动态创建sql数据库表的方法
    • 使用DateTime的ParseExact方法实现特殊日期时间的方法详解
    • 详解C# Socket编程笔记
    • 基于C#的socket编程的TCP异步的实现代码
    • C# RichTextBox制作文本编辑器
    • C# 禁止应用程序多次启动的实例
    • C#中图片旋转和翻转(RotateFlipType)用法分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有