Udp服务端和Tcp服务端类似,只不过Udp没有建立通信的过程,如下讲解了Udp服务端工作过程
初始化Udp服务端,并有发送和接收消息
using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
/// <summary>
/// 用于异步接收处理的辅助类
/// </summary>
public class State
{
public Socket _workSocket;
public const int _bufferSize = 1024;
public byte[] _buffer = new byte[_bufferSize];
public EndPoint _renmoteEp = (EndPoint)new IPEndPoint(IPAddress.Any,0);
}
public class SingleUdpServer
{
public static SingleUdpServer _myUdpServer;
public static SingleUdpServer GetInstance()
{
if(_myUdpServer == null)
{
_myUdpServer = new SingleUdpServer();
}
return _myUdpServer;
}
public SingleUdpServer ()
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress _ipAddress = ipHostInfo.AddressList[0];
EndPoint _localEP = new IPEndPoint(_ipAddress, 8002);
Socket _socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
_socket.Bind(_localEP);
State state = new State();
state._workSocket = _socket;
_socket.BeginReceiveFrom(state._buffer, 0, State._bufferSize,SocketFlags.None,ref state._renmoteEp,new AsyncCallback( EndReceiveFromCallback),state);
}
//异步接收回调函数
void EndReceiveFromCallback(IAsyncResult iar)
{
State state = (State)iar.AsyncState ;
Socket _mySocket = state._workSocket;
try
{
//完成接收
int byteRead = _mySocket.EndReceiveFrom(iar, ref state._renmoteEp);
//显示客户端地址和端口
Debug.Log("客户端终结点:"+ state._renmoteEp.ToString());
//显示接收信息
Debug.Log("接收数据字节数:"+ byteRead);
string message = Encoding.Default.GetString(state._buffer, 0, byteRead);
Debug.Log("来着客户端信息:"+ message);
//向客户端发送信息
SendMeaage(_mySocket, state._renmoteEp, "成功接收!");
}
catch (Exception e)
{
Debug.Log("发生异常!异常信息:"+e);
}
finally
{
//非常重要:继续异步接收
_mySocket.BeginReceiveFrom(state._buffer, 0, State._bufferSize,SocketFlags.None,ref state._renmoteEp,new AsyncCallback( EndReceiveFromCallback),state);
}
}
/// <summary>
/// 向客户端发送信息
/// </summary>
/// <param name="socket">本地Socket(服务器Socket)</param>
/// <param name="remoteEndPoint">客户端终结点</param>
/// <param name="Message">信息</param>
public void SendMeaage(Socket _mySocket, EndPoint remoteEndPoint, string Message)
{
byte[] bytes = Encoding.Default.GetBytes(Message);
_mySocket.SendTo(bytes, remoteEndPoint);
}
}
初始化Udp服务端
using UnityEngine;
using System.Collections;
public class InstanceUdpServer : MonoBehaviour {
void Start()
{
SingleUdpServer.GetInstance();
}
}