Unity socket 关于阻塞接收的问题

如果socket的recive放在update里,当这个比较卡的时候,就会丢失掉部分数据。最好是单独开一个线程来处理。

 

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;

public class test : MonoBehaviour {

// Use this for initialization
void Start () {

ThreadStart ts = new ThreadStart(test.ThreadWork);
Thread tr = new Thread(ts);
//tr.Priority = System.Threading.ThreadPriority.Lowest;
tr.Start();
}


public static List<string> send = new List<string>();
public static List<string> recv = new List<string>();
public static Mutex smutex = new Mutex();
public static Mutex rmutex = new Mutex();
static Socket soc;

public static void ThreadWork()
{

soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Connect("localhost", 6000);
soc.Blocking = false;

while (true)
{
if (soc.Connected)
{
//while (send.Count > 0)
//{
// smutex.WaitOne();
// string st = send[0];
// send.RemoveAt(0);
// smutex.ReleaseMutex();
// soc.Send(Encoding.UTF8.GetBytes(st));
//}
while (soc.Available > 1)
{
byte[] buff = new byte[1024];
soc.Receive(buff);
string rst = Encoding.UTF8.GetString(buff);
rmutex.WaitOne();
recv.Add(rst);
rmutex.ReleaseMutex();
}
}
else
{
soc.Connect("localhost", 6000);
Thread.Sleep(1000);
}
}
}

// Update is called once per frame
void Update () {
if (send.Count < 1)
{
smutex.WaitOne();
send.Add("zhao");
smutex.ReleaseMutex();
}


while (recv.Count > 0)
{
rmutex.WaitOne();
string rt = recv[0];
recv.RemoveAt(0);
rmutex.ReleaseMutex();
Debug.Log(rt);
}

//while (soc != null && soc.Available > 1)
//{
// byte[] buff = new byte[1024];
// soc.Receive(buff);
// string rst = Encoding.UTF8.GetString(buff);
// Debug.Log(rst);
//}
}

 




}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中,你可以使用 C# 的 System.Net.Sockets 命名空间来实现 socket 编程。要实现不同端口接收不同数据,你可以分别创建多个 Socket 对象,并将每个 Socket 绑定到不同的端口号上。 以下是一个简单的示例代码,演示如何实现在不同端口上接收不同数据: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class SocketReceiver { private Socket[] sockets = new Socket[2]; private byte[] buffer = new byte[1024]; public void Start() { // 创建两个 Socket 对象,并分别绑定到不同的端口上 sockets[0] = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sockets[0].Bind(new IPEndPoint(IPAddress.Any, 1234)); sockets[1] = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sockets[1].Bind(new IPEndPoint(IPAddress.Any, 5678)); // 开始异步接收数据 for (int i = 0; i < sockets.Length; i++) { Socket socket = sockets[i]; EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), socket); } } private void OnReceive(IAsyncResult ar) { Socket socket = (Socket)ar.AsyncState; EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); int bytesRead = socket.EndReceiveFrom(ar, ref remoteEP); string message = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine("Received message: " + message + " on port " + ((IPEndPoint)socket.LocalEndPoint).Port); // 继续异步接收数据 socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), socket); } } ``` 在这个示例中,我们创建了两个 Socket 对象,分别绑定到端口号为 1234 和 5678 上。然后,在每个 Socket 上异步接收数据,并在回调函数中打印接收到的消息和端口号。注意,这里我们使用了 BeginReceiveFrom 和 EndReceiveFrom 方法来接收数据,这是因为我们需要在异步模式下接收数据,以便我们能同时接收来自多个端口的数据。 你可以根据需要修改这个示例代码,以适应你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值