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. 包装类、Object类——Java笔记(八)

    包装类:     基本数据类型的包装类     基本数据类型 包装类 byte Byte short Short int Integer long Long char Character float ...

  2. AT&amp;T汇编——在你开始写

    不知不觉,少年将超过,计算机相关知识,学到基本上可以说是教过.毕业.所以,我们打算更深入了解自己的兴趣背着背笼.也因为它是检讨大学. 计划写的内容在: 1.汇编语言 2.C/C++语言 3.Linux ...

  3. linux_删除空文件(大小等于0的文件)的方法

    1: 查看 find . -name "*" -type f -size 0c 2:删除 find . -name "*" -type f -size 0c | ...

  4. C++ 对象模型具体评论(特别easy理解力)

    c++对象模型系列 转 一.指针与引用 一 概括 指针和引用,在C++的软件开发中非经常见,假设能恰当的使用它们可以极大的提 高整个软件的效率,可是非常多的C++学习者对它们的各种使用情况并非都了解, ...

  5. 我在Yahoo与ATS 九死一生的故事

    我在Yahoo与ATS 九死一生的故事 http://www.sunchangming.com/blog/post/4667.html 去年9月,我去Yahoo后领导交给我的第一件事,就是把Yahoo ...

  6. jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)

    经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端, ...

  7. SQL表连接

    背景 在上次的自考科目<数据库系统原理>中.已经接触到了关于数据库表连接的一些知识,近期的学习过程中又用到了关于数据库表的连接问题,趁此再跟大家一起回想一下. 导图总结 首先用一张思维导图 ...

  8. jQuery 文件碎片

    经JS操作DOM节点可以是节点的单位,让我们连接节点,能够createElement,createTextNode,然后,appendChild定在一起,然后再用appendChild或insertB ...

  9. linux简单的数据包捕获分析

    有时我们会遇到一些问题,需要捕捉数据包分析,当手头有没有专业的抓图工具,您可以使用tcpdump相反,看看(一般版本附带这个工具) 比如,我们要分析eth0与接口192.168.7.188 这个对象I ...

  10. 学习Easyui

    学习Easyui 社区easyui 论坛:http://bbs.jeasyuicn.com API地址:http://www.jeasyuicn.com/api 简单桌面版:http://app.bt ...