直接上代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
/// <summary>
/// UDP协议异步通讯类(服务器端)
/// </summary>
public class UDPServer
{
/// <summary>
/// 容器对象
/// </summary>
public class UDPServerState
{
//服务器端
public Socket UDPServer
{
get;
set;
}
//接受数据缓冲区
private byte[] m_receiveBuffer = new byte[1024];
public byte[] ReceiveBuffer
{
get
{
return m_receiveBuffer;
}
}
//远程终端
public EndPoint m_remoteEP;
public void ClearReceiveBuffer()
{
for (int i = 0; i < 1024; i++)
{
ReceiveBuffer[i] = 0;
}
}
}
public UDPServerState ServerState
{
get;
set;
}
/// <summary>
/// 服务器绑定终端节点
/// </summary>
public void ServerBind()
{
//主机IP
IPEndPoint serverEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9000);
Socket UDPServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UDPServer.Bind(serverEP);
Debug.Log("server ready...");
ServerState = new UDPServerState();
ServerState.UDPServer = UDPServer;
ServerState.m_remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
AsyncRecive();
}
/// <summary>
/// 异步接受消息
/// </summary>
public void AsyncRecive()
{
ServerState.ClearReceiveBuffer();
ServerState.UDPServer.BeginReceiveFrom(ServerState.ReceiveBuffer, 0, ServerState.ReceiveBuffer.Length, SocketFlags.None, ref ServerState.m_remoteEP,
new AsyncCallback(ReciveCallback), null);
}
/// <summary>
/// 异步接受消息回调函数
/// </summary>
/// <param name="asyncResult"></param>
public void ReciveCallback(IAsyncResult asyncResult)
{
if (asyncResult.IsCompleted)
{
try
{
//获取发送端的终节点
ServerState.m_remoteEP = new IPEndPoint(IPAddress.Any, 0);
int charactorsCount = ServerState.UDPServer.EndReceiveFrom(asyncResult, ref ServerState.m_remoteEP);
string base64string = Encoding.ASCII.GetString(ServerState.ReceiveBuffer);
}
catch (Exception e)
{
Debug.Log("服务端接收数据出错:" + e);
}
finally
{
//继续接受消息
AsyncRecive();
}
}
else
{
Debug.Log("服务端接收数据失败");
//继续接受消息
AsyncRecive();
}
}
/// <summary>
/// 异步发送消息
/// </summary>
/// <param name="message"></param>
public void AsyncSend(string message)
{
Debug.Log("server-->-->client:" + message);
byte[] buffer = Encoding.UTF8.GetBytes(message);
ServerState.UDPServer.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, ServerState.m_remoteEP),
new AsyncCallback(SendCallback), null);
}
/// <summary>
/// 异步发送消息回调函数
/// </summary>
/// <param name="asyncResult"></param>
public void SendCallback(IAsyncResult asyncResult)
{
//消息发送完毕
if (asyncResult.IsCompleted)
{
ServerState.UDPServer.EndSendTo(asyncResult);
Debug.Log("服务端发送数据完成");
}
else
{
Debug.Log("服务端发送数据失败");
}
}
//连接关闭
public void SocketQuit()
{
//最后关闭socket
if (ServerState.UDPServer != null)
ServerState.UDPServer.Close();
}
}