一、代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
//针对回调函数,定义一个消息list,在Update里处理消息
// private List UDPOrders = new List();
//void Update()
//{
// if (UDPOrders.Count > 0)
// {
// Log.text = "Recv:" + UDPOrders[0];
// //处理一个清空一个
// UDPOrders.RemoveAt(0);
// }
//}
public delegate void RecvCallBack(string msg);
public class AnUDP
{
//默认使用ASCII
private int UdpPort;//端口号
private bool IsUdpVaild;//是否可用
private Socket UdpSocket;//socket
private Thread RecvThread;//接收线程
private RecvCallBack CallBack;//回调函数
public AnUDP()
{
UdpPort = 0;
CallBack = null;
IsUdpVaild = false;
}
public bool Open(string SelfIP,int SelfPort)
{
Debug.Log(SelfIP);
UdpPort = SelfPort;
//定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
IPEndPoint UdpPoint = new IPEndPoint(IPAddress.Parse(SelfIP), UdpPort);
//定义套接字类型,在主线程中定义
UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UdpSocket.Bind(UdpPoint);
//
IsUdpVaild = true;
return true;
}
public void Close()
{
if (RecvThread != null)
{
RecvThread.Abort();
RecvThread.Interrupt();
}
UdpSocket.Close();
}
public bool SendTo(string TargetIP, int TargetPort,string msg)
{
if (!IsUdpVaild) return false;
//清空发送缓存
byte[] sendData = new byte[1024];
//数据类型转换
sendData = Encoding.ASCII.GetBytes(msg);
//
EndPoint sendPoint = new IPEndPoint(IPAddress.Parse(TargetIP), TargetPort);
//发送给指定客户端
UdpSocket.SendTo(sendData, sendData.Length, SocketFlags.None, sendPoint);
return true;
}
public void StartRecv(RecvCallBack _call)
{
if (!IsUdpVaild) return;
if (RecvThread==null)
{
RecvThread = new Thread(new ThreadStart(SocketReceive));
RecvThread.Start();
}
//接收回调
CallBack = _call;
}
private void SocketReceive()
{
while (true)
{
try
{
//创建消息
byte[] recvData = new byte[1024];
EndPoint recvPoint = new IPEndPoint(IPAddress.Any, UdpPort);
//接收
int recvLen = UdpSocket.ReceiveFrom(recvData, ref recvPoint);
if (recvLen > 0)
{
string data = Encoding.ASCII.GetString(recvData, 0, recvLen);
if (CallBack!=null)
{
CallBack(data);
}
}
}
catch (Exception e)
{
}
}
}
}
二、针对回调函数
1.定义消息队列
private AnUDP UPD;
private List UDPOrders = new List();
2.定义回调函数
void OnUDPRecv(string data)
{
UDPOrders.Add(data);
}
3.启用UDP并设置回调
UPD = new AnUDP();
if(UPD.Open(SelfIP,Selfport))
{
UPD.StartRecv(OnUDPRecv);
}
4.发送
UPD.SendTo("127.0.0.1",10000,"Hello");
三、针对SocketException
出现错误:SocketException: 在其上下文中,该请求的地址无效。一般都是你的ip地址不是所在网段里的地址