自己仿照某商业组件开发的通讯模块,简单的调用便可实现传文件,即时通讯等内容.
如图,只需要绑定ip便可以通讯
组件下载地址:点击打开链接
调用的方法:
class Program
{
public static DataDispatcher dd;
static void Main(string[] args)
{
dd = new DataDispatcher("192.168.167.105:8003");// 这里填写自己的ip
dd.OnDataArrived += dd_OnDataArrived;
}
static void dd_OnDataArrived(byte[] in_listVariablePool)
{
Console.WriteLine("收到数据!");
VariablePool vp = new VariablePool();
vp.Init(in_listVariablePool);
string ip = (string)vp.Get("IP",0);// 获取发送方的IP
// 以上是接受数据
// 下方是发送数据
vp.Init();
vp.Put("IP", ip);
vp.Put("string", DateTime.Now.ToString());
dd.Send(vp.GetVariablePool(),ip);
}
}
完整源代码:
0.目录:
1.主要通讯层DataDispatcher:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using SocketByUDPClassLibrary;
namespace UDPClassLibrary
{
// 定义一个接受到数据时响应的委托
public delegate void OnDataArrivedDelegate(byte[] in_listVariablePool);
public class DataDispatcher
{
// 定义完成事件
public event OnDataArrivedDelegate OnDataArrived;
// 接收池
private Dictionary<int, DataPools> m_listInDataPools;
// 发送池
private Dictionary<int, DataPools> m_listOutDataPools;
// 本机IP地址
private IPEndPoint m_ipSelfIP;
// 接收时的服务变量
private Socket m_SocketService;
private Thread m_threadStartService;
// 线程锁
private Mutex m_mutexPick;
// 并发缓解
private int m_iPush = 1;
// 等待时间(毫秒)
private int m_iWait = 500;
/// <summary>
/// 构造方法
/// </summary>
public DataDispatcher(string in_strIPInfo)
{
// 获得IP
m_ipSelfIP = StrToEndPoint(in_strIPInfo);
// 数据池初始化
m_listInDataPools = new Dictionary<int, DataPools>();
m_listOutDataPools = new Dictionary<int, DataPools>();
// 启动服务
m_threadStartService = new Thread(StartService);
m_threadStartService.Start();
m_mutexPick = new Mutex();
Thread threadTimer=new Thread(MyTime);
threadTimer.Start();
}
/// <summary>
/// 启动服务
/// </summary>
public void StartService()
{
// 使用Socket服务
m_SocketService = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 绑定网络地址
m_SocketService.Bind(m_ipSelfIP);
// 客户机IP
IPEndPoint senderPoint = new IPEndPoint(IPAddress.Any, 0);
EndPoint senderEndPoint = (EndPoint)(senderPoint);
// 数据大小
int iDataSize;
// 字节数据
byte[] bData = new byte[2048];
List<byte[]> listIncomeDatas = new List<byte[]>();
Thread threadAllotPack;
object objCustomParm;
// 循环监听是否取到包
while (true)
{
bData = new byte[2048];
//接收信息
iDataSize = m_SocketService.ReceiveFrom(bData, ref senderEndPoint);
// 如果是数据包 接收,如果是重发请求包 重发
if (iDataSize == 2048)
{
// 自定义参数
objCustomParm = new CustomParm(bData, senderEndPoint);
// 添加线程
threadAllotPack = new Thread(AllotPack);
// 分配收到的包
threadAllotPack.Start(objCustomParm);
}
else
{
// 根据信息重发
SendByInfo((ResendInfo)SetByteToValue(bData));
Console.WriteLine("收到请求包");
}
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="in_listToSendData"></param>
/// <param name="in_strDesIP"></param>
public void Send(byte[] in_listToSendData, string in_strDesIP)
{
List<byte> listByte = new List<byte>();
listByte.AddRange(in_listToSendData);
// 设置目标IP,设置TCP端口号
IPEndPoint ipEndPoint = StrToEndPoint(in_strDesIP);
// 调用包组件
ByePacketUtil stPacketUtil = new ByePacketUtil();
// 声明包组变量
List<byte[]> listToSendDatas = stPacketUtil.SplitPacket(listByte);