unity网络通讯

13 篇文章 0 订阅

发送时可以设置每3秒最最只发30条消息


int bufferSize = 64000

private NetworkStream _stream;private byte[] _receiveBuffer = new byte[bufferSize];        // 准备接收的数据缓冲
private byte[] _sendBuffer = new byte[bufferSize];            // 准备发送的数据缓冲
private byte[] _receiveTokenBuffer = new byte[bufferSize];



// 连接服务器
public override bool connect ()
{
	if (_connectThread == null && _state != CONNECTION_STATE.CONNECTED)
	{
		_connectThread = ThreadManager.GetInstance().StartThread(new ThreadStart(connectThread));
		return true;
	}
	return false;
}

private void connectThread()
{
	try 
	{
		LogManager.GetInstance().info ("Connecting...{0} : {1} ",ip,port);
		_state = CONNECTION_STATE.CONNECTING;
		_client = new TcpClient(ip,port);
		if (!_client.Connected)
			throw new Exception("连接失败");
		_state = CONNECTION_STATE.CONNECTED;
		_stream = _client.GetStream ();
		_first = true;
		AsyncCallback callBack = new AsyncCallback (ReadComplete);
		lock (_stream) {
			_stream.BeginRead (_receiveBuffer, 0, bufferSize, callBack, null);
		}
		onConnect ();
	} 
	catch (Exception ex) 
	{
		_client = null;
		_state = CONNECTION_STATE.CONNECTFAIL;
	}
	_connectThread = null;
}
		
		
// 发送消息(线程)
private void sendMessages ()
{
...
	if (_client == null)
	{
		reconnect();
		return;
	}
		
		
	if (_client.connected == null)
	{
		reconnect();
		return;
	}
...
	lock (_stream) { _stream.Write (_sendBuffer, 0, size); }//发送
...
}

private void ReadComplete (IAsyncResult ar)
{
	if (_client == null)
	{
		reconnect();
		return;
	}
		
		
	if (_client.connected == null)
	{
		reconnect();
		return;
	}
	
	try
	{
		int bytesRead = 0;
		lock (_stream) { bytesRead = _stream.EndRead (ar); }
		// 本次读取的字节数
		if (bytesRead == 0) throw new Exception ("Connect-----Reading data, 0 byte");
		int index = 0;
		// 先处理上次收包残留的数据
		if (_receiveTokenSize > 0) 
		{	
			// 至少是一个short,才能完整读出协议的长度
			if (_receiveTokenSize >= 2)
			{
				ushort size = getMessageSize(_receiveTokenBuffer,0);//System.BitConverter.ToUInt16 (_receiveTokenBuffer, 0);
				
				// 还不是一个完整的包
				if (bytesRead + _receiveTokenSize < size) 
				{
					index = bytesRead;
					Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
					_receiveTokenSize += bytesRead;
				} 
				else 
				{
					ushort ptcl = getMessagePtcl(_receiveTokenBuffer,0); //System.BitConverter.ToUInt16 (_receiveTokenBuffer, 2);
					// 读取完整的协议包
					index = size - _receiveTokenSize;
					Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
					_receiveTokenSize = 0;
					readMessage (ptcl, _receiveTokenBuffer,getMessageOffset(),size - getMessageOffset());
				}
			}
			else
			{
				index = bytesRead;
				Array.Copy (_receiveBuffer, 0, _receiveTokenBuffer, _receiveTokenSize, index);
				_receiveTokenSize += bytesRead;
			}
		}
		
		
	
		// 还有数据可以处理
		while (index < bytesRead) 
		{
			if (bytesRead - index >= 2)
			{
				ushort size = getMessageSize(_receiveBuffer,index);// System.BitConverter.ToUInt16 (_receiveBuffer, index);
				
				// 协议不完整
				if (index + size > bytesRead) 
				{
					_receiveTokenSize = bytesRead - index;
					Array.Copy (_receiveBuffer, index, _receiveTokenBuffer, 0, _receiveTokenSize);
					break;
				}
				
				ushort ptcl = getMessagePtcl(_receiveBuffer,index); // System.BitConverter.ToUInt16 (_receiveBuffer, index + 2);
				readMessage (ptcl, _receiveBuffer, index + getMessageOffset(), size - getMessageOffset());
				index += size;
			}
			else
			{
				_receiveTokenSize = bytesRead - index;
				Array.Copy (_receiveBuffer, index, _receiveTokenBuffer, 0, _receiveTokenSize);
				break;
			}
		}
		// 清空缓存,避免脏读
		Array.Clear (_receiveBuffer, 0, _receiveBuffer.Length);
		// 再次调用BeginRead(),完成时调用自身,形成无限循环
		AsyncCallback callBack = new AsyncCallback (ReadComplete);
		lock (_stream) { _stream.BeginRead (_receiveBuffer, 0, bufferSize, callBack, null); }
	}
	catch (Exception ex)
	{
		recvMessageError();
		LogManager.GetInstance().error("接收消息失败  {0}:{1}  {2}",ip,port,ex.ToString());
	}
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的TCP/IP通信是指使用TCP/IP协议进行网络通信的一种方式。通过TCP/IP通信,可以实现不同设备之间的数据传输和交互。 在Unity中,可以使用C#的Socket类来实现TCP/IP通信。以下是一个简单的示例代码,演示了如何在Unity中建立一个TCP服务器和一个TCP客户端: 1. TCP服务器端代码: ```csharp using System; using System.Net; using System.Net.Sockets; using UnityEngine; public class TCPServer : MonoBehaviour { private TcpListener server; private TcpClient client; private void Start() { // 创建服务器监听 server = new TcpListener(IPAddress.Any, 8888); server.Start(); // 接受客户端连接 client = server.AcceptTcpClient(); Debug.Log("Client connected!"); // 开启接收消息的线程 System.Threading.Thread receiveThread = new System.Threading.Thread(ReceiveMessage); receiveThread.Start(); } private void ReceiveMessage() { try { // 获取网络流 NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead; while (true) { // 读取客户端发送的消息 bytesRead = stream.Read(buffer, 0, buffer.Length); string message = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); Debug.Log("Received message: " + message); } } catch (Exception e) { Debug.Log("Error: " + e.Message); } } private void OnDestroy() { // 关闭连接 client.Close(); server.Stop(); } } ``` 2. TCP客户端代码: ```csharp using System; using System.Net.Sockets; using UnityEngine; public class TCPClient : MonoBehaviour { private TcpClient client; private void Start() { // 创建客户端连接 client = new TcpClient(); client.Connect("127.0.0.1", 8888); Debug.Log("Connected to server!"); // 开启发送消息的线程 System.Threading.Thread sendThread = new System.Threading.Thread(SendMessage); sendThread.Start(); } private void SendMessage() { try { // 获取网络流 NetworkStream stream = client.GetStream(); while (true) { // 从控制台读取消息并发送给服务器 string message = Console.ReadLine(); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message); stream.Write(buffer, 0, buffer.Length); } } catch (Exception e) { Debug.Log("Error: " + e.Message); } } private void OnDestroy() { // 关闭连接 client.Close(); } } ``` 以上代码演示了一个简单的TCP服务器和TCP客户端的实现。服务器监听本地IP地址的8888端口,客户端连接到服务器的IP地址和端口。服务器接收客户端发送的消息并打印到控制台,客户端从控制台读取消息并发送给服务器。 注意:以上代码仅为示例,实际使用时需要进行错误处理、线程管理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值