Udp客户端和Tcp客户端类似,只不过Udp没有建立通信的过程,如下讲解了Udp客户端工作过程
单例类用来初始化Udp,并有发送和接收消息等
using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
/// <summary>
/// 用于异步接收处理的辅助类
/// </summary>
public class State
{
public Socket _workSocket;
public const int _bufferSize = 1024;
public byte[] _buffer = new byte[_bufferSize];
public EndPoint _renmoteEp = new IPEndPoint(IPAddress.Any,0);
}
public class SingleUdpClient
{
public static SingleUdpClient _myUdpClient;
private Socket _clientSocket ;
public static SingleUdpClient GetInstance()
{
if(_myUdpClient == null)
{
_myUdpClient = new SingleUdpClient();
}
return _myUdpClient;
}
public SingleUdpClient()
{
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
//客户端使用的终结点
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
_clientSocket.Bind(localEP);
State _state = new State();
_state._workSocket = _clientSocket;
// //服务端发送消息,确认连接
// EndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.1.216"), 6000);
// SendMeaage(_clientSocket, remoteEP, "你好,这里是客户端,收到请回复!Over~~~~");
_clientSocket.BeginReceiveFrom(_state._buffer,0,State._bufferSize,SocketFlags.None,ref _state._renmoteEp,new AsyncCallback(ReceiverCallBack),_state);
}
void ReceiverCallBack(IAsyncResult _ar)
{
State _state = (State) _ar.AsyncState;
Socket _myClientSocket = _state._workSocket;
try
{
//完成接收
int _dataLength = _myClientSocket.EndReceiveFrom(_ar, ref _state._renmoteEp);
//显示客户端地址和端口
Debug.Log("服务器终结点:"+ _state._renmoteEp.ToString());
//显示接收信息
Debug.Log("接收数据字节数:"+ _dataLength);
string _dataReceive = Encoding.Default.GetString(_state._buffer, 0, _dataLength);
ReceiveData(_dataReceive);
//向客户端发送信息
SendMeaage(_myClientSocket, _state._renmoteEp, "成功接收!");
}
catch (Exception e)
{
Debug.Log("发生异常!异常信息:"+e);
}
finally
{
//非常重要:继续异步接收
_myClientSocket.BeginReceiveFrom(_state._buffer, 0, State._bufferSize,SocketFlags.None,ref _state._renmoteEp,new AsyncCallback( ReceiverCallBack),_state);
}
}
void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message)
{
byte[] bytes = Encoding.Default.GetBytes(Message);
socket.SendTo(bytes, remoteEndPoint);
}
public void SendButtonMessage( string _ipAddress,string _data)
{
EndPoint remoteEP = new IPEndPoint(IPAddress.Parse(_ipAddress), 6000);
SendMeaage(_clientSocket, remoteEP, _data);
}<pre name="code" class="html"> //广播消息
public void SendButtonMessage(string _data)
{
byte[] bytes = Encoding.Default.GetBytes(_data);
_clientSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);
EndPoint iep = new IPEndPoint(IPAddress.Broadcast,60000);
_clientSocket.SendTo(bytes,iep);
}
public string ReceiveData(string _data) { Debug.Log(_data); return _data; } }
实例化Udp,并发送消息
using UnityEngine;
using System.Collections;
public class InstanceUdpClient : MonoBehaviour {
void Start () {
SingleUdpClient.GetInstance();
}
void Update()
{
if(Input.GetMouseButtonDown(0))
{
SingleUdpClient.GetInstance().SendButtonMessage("192.168.1.216","Lee");
}
}
}