Socket(Udp)通信客户端

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");
		}
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值