public class SocketHelper
{
/// <summary>
/// 功能描述:得到一个实例对象
/// </summary>
/// <returns>SocketHelper</returns>
public static SocketHelper GetSocketHelper()
{
try
{
return new SocketHelper();
}
catch
{
throw;
}
}
/// <summary>
/// 委托
/// </summary>
/// <param name="intport">intport</param>
/// <param name="strmsg">strmsg</param>
public delegate void RecvGBDelegate(int intport, string strmsg);
/// <summary>
/// 监听到广播事件
/// </summary>
public event RecvGBDelegate OnRecvGBMessageChanged; /// <summary>
/// 功能描述:监听广播,使用线程调用
/// 作  者:huangzh
/// 创建日期:2015-08-17 10:28:19
/// 任务编号:
/// </summary>
/// <param name="objport">监听端口</param>
public void RecvUDPGB(object objport)
{
UdpClient client = null;
try
{
if (!(objport is int))
{
throw new Exception("参数不是int类型");
}
int intport = Convert.ToInt32(objport);
client = new UdpClient(new IPEndPoint(IPAddress.Any, intport));
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, );
while (true)
{
byte[] buf = client.Receive(ref endpoint);
string strmsg = Encoding.UTF8.GetString(buf);
if (strmsg.IndexOf("CloseClient") >= )
break;
OnRecvGBMessageChanged(intport, strmsg);
}
}
catch
{
throw;
}
finally
{
if (client != null)
client.Close();
}
} /// <summary>
/// 功能描述:发送广播
/// </summary>
/// <param name="strmsg">strmsg</param>
/// <param name="intport">intport</param>
public void SendUDPGB(string strmsg, int intport)
{
try
{
SendUDPGB(Encoding.UTF8.GetBytes(strmsg), intport);
}
catch
{
throw;
}
} /// <summary>
/// 功能描述:发送广播
/// </summary>
/// <param name="buf">buf</param>
/// <param name="intport">intport</param>
public void SendUDPGB(byte[] buf, int intport)
{
UdpClient client = null;
try
{
client = new UdpClient(new IPEndPoint(IPAddress.Any, ));
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), intport);
client.Send(buf, buf.Length, endpoint); }
catch
{
throw;
}
finally
{
if (client != null)
{
client.Close();
}
}
} /// <summary>
/// 功能描述:接收文件
/// </summary>
/// <param name="intport">intport</param>
/// <param name="strApplicationPath">strApplicationPath</param>
/// <returns>返回值</returns>
public bool RecvFile(int intport, string strApplicationPath)
{
Socket server = null;
Socket client = null;
try
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, intport); //创建一个套接字
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(); //确认连接
client = server.Accept(); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string strSendFileName = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
//获得[保存位置]
string strSavePath = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
strSendFileName = strApplicationPath + "\\" + (string.IsNullOrEmpty(strSavePath) ? "" : (strSavePath + "\\")) + strSendFileName;
string strdir = Path.GetDirectoryName(strSendFileName);
if (!Directory.Exists(strdir))
{
Directory.CreateDirectory(strdir);
}
//获得[包的大小]
string strbagSize = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int intbagCount = int.Parse(System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string strbagLast = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
using (FileStream myFileStream = new FileStream(strSendFileName, FileMode.Create, FileAccess.Write))
{
//已发送包的个数
int intSendedCount = ; while (true)
{
byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == )
{
break;
}
else
{
intSendedCount++;
//将接收到的数据包写入到文件流对象
myFileStream.Write(data, , data.Length);
//显示已发送包的个数
//MessageBox.Show("已发送包个数"+SendedCount.ToString());
}
}
}
}
catch
{
throw;
}
finally
{
//关闭套接字
if (client != null)
client.Close();
if (server != null)
server.Close(); }
return true;
} /// <summary>
/// 功能描述:发送文件
/// </summary>
/// <param name="strfile">文件路径</param>
/// <param name="strDirName">发布相对位置</param>
/// <param name="toip">目标ip</param>
/// <param name="inttoPort">目标端口</param>
public void SendFile(
string strfile,
string strDirName,
IPAddress toip,
int inttoPort)
{
Socket client = null;
try
{
//创建一个文件对象
FileInfo ezoneFile = new FileInfo(strfile);
//打开文件流
using (FileStream ezoneStream = ezoneFile.OpenRead())
{
//包的大小
int intPacketSize = ;
//包的数量
int intPacketCount = (int)(ezoneStream.Length / ((long)intPacketSize));
//this.textBox8.Text=PacketCount.ToString();
//this.progressBar1.Maximum=PacketCount;
//最后一个包的大小
int intLastDataPacket = (int)(ezoneStream.Length - ((long)(intPacketSize * intPacketCount))); //指向远程服务端节点
IPEndPoint ipep = new IPEndPoint(toip, inttoPort);
//创建套接字
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得客户端的IP地址
//this.textBox7.Text=clientep.Address.ToString();
//发送[文件名]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(ezoneFile.Name));
//发送[保存位置]到客户端
strDirName = strDirName.Trim(new char[] { '\\' });
TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(strDirName));
//发送[包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intPacketSize.ToString()));
//发送[包的总数量]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intPacketCount.ToString()));
//发送[最后一个包的大小]到客户端
TransferFiles.SendVarData(client, System.Text.Encoding.UTF8.GetBytes(intLastDataPacket.ToString())); //数据包
byte[] data = new byte[intPacketSize];
//开始循环发送数据包
for (int i = ; i < intPacketCount; i++)
{
//从文件流读取数据并填充数据包
ezoneStream.Read(data, , data.Length);
//发送数据包
TransferFiles.SendVarData(client, data);
////显示发送数据包的个数
//this.textBox10.Text=((int)(i+1)).ToString();
////进度条值的显示
//this.progressBar1.PerformStep();
} //如果还有多余的数据包,则应该发送完毕!
if (intLastDataPacket != )
{
data = new byte[intLastDataPacket];
ezoneStream.Read(data, , data.Length);
TransferFiles.SendVarData(client, data);
// this.progressBar1.Value=this.progressBar1.Maximum;
}
}
}
catch
{
throw;
}
finally
{
if (client != null)
client.Close();
}
} /// <summary>
/// 功能描述:发送信息
/// </summary>
/// <param name="ip">ip</param>
/// <param name="intport">intport</param>
/// <param name="strmsg">msg</param>
public void SendMsg(
IPAddress ip,
int intport,
string strmsg)
{
UdpClient uc = null;
try
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strmsg);
uc = new UdpClient();
uc.Send(bytes, bytes.Length, ip.ToString(), intport); }
catch
{
throw;
}
finally
{
if (uc != null)
{
uc.Close();
}
}
}
/// <summary>
/// 监听委托
/// </summary>
/// <param name="strmsg">strmsg</param>
public delegate void RecvMsgDelegate(string strmsg);
/// <summary>
/// 监听事件
/// </summary>
public event RecvMsgDelegate OnRecvMsg; /// <summary>
/// 功能描述:接收信息
/// </summary>
/// <param name="objport">objport</param>
public void RecvMsg(object objport)
{
if (!(objport is int))
{
throw new Exception("参数不是int类型");
}
int intport = Convert.ToInt32(objport);
UdpClient uc = null;
try
{
uc = new UdpClient(intport);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, );
while (true)
{
string strtext = System.Text.Encoding.UTF8.GetString(uc.Receive(ref iep));
if (strtext == "Close")
break;
OnRecvMsg(strtext);
}
uc.Close();
}
catch
{
throw;
}
finally
{
if (uc != null)
{
uc.Close();
}
}
} public IPAddress GetThisIPAddress()
{
try
{
string strhostName = Dns.GetHostName();
IPAddress[] addressList = Dns.GetHostAddresses(strhostName);
IPAddress thisIp = null;
foreach (IPAddress item in addressList)
{
if (item.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
thisIp = item;
break;
}
}
return thisIp;
}
catch
{
throw;
}
}
}
  public class TransferFiles
{
/// <summary>
/// 功能描述:发送数据
/// </summary>
/// <param name="s">s</param>
/// <param name="data">data</param>
/// <returns>返回值</returns>
public static int SendData(Socket s, byte[] data)
{
int inttotal = ;
int intsize = data.Length;
int intdataleft = intsize;
int intsent; while (inttotal < intsize)
{
intsent = s.Send(data, inttotal, intdataleft, SocketFlags.None);
inttotal += intsent;
intdataleft -= intsent;
} return inttotal;
} /// <summary>
/// 功能描述:接收数据
/// </summary>
/// <param name="s">s</param>
/// <param name="intsize">size</param>
/// <returns>返回值</returns>
public static byte[] ReceiveData(Socket s, int intsize)
{
int inttotal = ;
int intdataleft = intsize;
byte[] data = new byte[intsize];
int intrecv;
while (inttotal < intsize)
{
intrecv = s.Receive(data, inttotal, intdataleft, SocketFlags.None);
if (intrecv == )
{
data = null;
break;
} inttotal += intrecv;
intdataleft -= intrecv;
}
return data;
} /// <summary>
/// 功能描述:发送数据
/// </summary>
/// <param name="s">s</param>
/// <param name="data">data</param>
/// <returns>返回值</returns>
public static int SendVarData(Socket s, byte[] data)
{
int inttotal = ;
int intsize = data.Length;
int intdataleft = intsize;
int intsent;
byte[] datasize = new byte[];
datasize = BitConverter.GetBytes(intsize);
intsent = s.Send(datasize); while (inttotal < intsize)
{
intsent = s.Send(data, inttotal, intdataleft, SocketFlags.None);
inttotal += intsent;
intdataleft -= intsent;
} return inttotal;
} /// <summary>
/// 功能描述:接收数据
/// </summary>
/// <param name="s">s</param>
/// <returns>返回值</returns>
public static byte[] ReceiveVarData(Socket s)
{
int inttotal = ;
int intrecv;
byte[] datasize = new byte[];
intrecv = s.Receive(datasize, , , SocketFlags.None);
int intsize = BitConverter.ToInt32(datasize, );
int intdataleft = intsize;
byte[] data = new byte[intsize];
while (inttotal < intsize)
{
intrecv = s.Receive(data, inttotal, intdataleft, SocketFlags.None);
if (intrecv == )
{
data = null;
break;
}
inttotal += intrecv;
intdataleft -= intrecv;
}
return data;
}
}

包含了:广播,消息,发送文件等

Socket一些常用的方法封装的更多相关文章

  1. appium安卓自动化的 常用driver方法封装

    appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...

  2. 常用js方法封装

    常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...

  3. JS常用公共方法封装

    _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||/ ...

  4. 项目常用JS方法封装--奋斗的IT青年(微信公众号)

                                                                                                        ...

  5. JavaScript常用工具方法封装

    因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字符串 return Object.prototype. ...

  6. 常用js方法封装使用

    // 冒泡排序 export function bubbleSort(arr) { let i = arr.length - 1; while (i > 0) { let maxIndex = ...

  7. C#常用字符串加解密方法封装

    C#中常用的字符串加密.解密方法封装,包含只加密但不解密的方法.收藏起来备用. //方法一 //须添加对System.Web的引用 //using System.Web.Security; /// & ...

  8. WebAPi添加常用扩展方法及思维发散

    前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...

  9. JOptionPane类提示框的一些常用的方法

    JOptionPane类提示框的一些常用的方法 XMLOracleSwing 最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理了 ...

随机推荐

  1. 怎样解决chm类型的文件在Windows操作系统中无法打开

    又一次安装了Windows 7操作系统,发现chm文件类型Java API文档无法打开了,纠结了半天最终搞定,现总结一下: 1.选中该chm类型的文件,右键鼠标选择并点击"属性(R)&quo ...

  2. UVa 10223 - How many nodes ?

    称号:气你一个整数n,问:多少节点可以产生n不同的二叉树. 分析:数论,卡特兰数.根据定义,你可以. 说明:请参阅http://blog.csdn.net/mobius_strip/article/d ...

  3. crawler_wireshark 过滤基础知识

    一.IP过滤:包括来源IP或者目标IP等于某个IP比如:ip.src addr==192.168.0.208  or ip.src addr eq 192.168.0.208 显示来源IP       ...

  4. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库

    原文:如何利用[百度地图API],制作房产酒店地图?(下)--结合自己的数据库 摘要:应广大API爱好者要求,写了一篇利用自己数据库标点的文章…… -------------------------- ...

  5. Webbrowser控件史上最强技巧全集

    原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...

  6. 兔子--gradle安装和配置

    1.下载gradle,下载--all的这个 点击进入下载页 2.下载下来后,解压.配置环境变量. 编辑path , ....;G:\soft\gradle-2.2.1-all\gradle-2.2.1 ...

  7. JavaScript中的单引号和双引号报错的解决方法

    在使用JavaScript显示消息或者传递字符数据的时候,经常会碰到数据中夹杂单引号(')或者双引号("),这种语句往往会造成JavaScript报错.对此一般采用/'或者/"的解 ...

  8. svg的自述

    svg可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. SVG 是使用 XML 来描述二维图形和绘图程序的语言. 什么是SVG? SVG 指可 ...

  9. Kafka spring 集成

    下载配置kafka参考该链接:http://www.cnblogs.com/super-d2/p/4534323.html pom.xml: <dependency> <groupI ...

  10. 使用 C# 进行 Outlook 2007 编程

    原文:使用 C# 进行 Outlook 2007 编程 探讨如何使用 C# 编程语言生成 Outlook 识别的应用程序和 Outlook 外接程序. 请从"Add References&q ...