Unity UDP协议

不熟悉TCP/UDP协议的同学可以参考这篇文章:http://blog.csdn.net/li_ning_/article/details/52117463

话不多少说,服务器端代码如下:

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

public class Server : MonoBehaviour {

    private UdpClient udpClient;

    private bool isRunningThread;

    private Thread thread_udpRecv;

    private Queue<string> queue_udpMessage;

	// Use this for initialization
	void Start () {
        queue_udpMessage = new Queue<string>();
        CreateUdpListener();
	}
	
	// Update is called once per frame
	void Update () {
	    if(queue_udpMessage.Count > 0)
        {
            string cmd = queue_udpMessage.Dequeue();
            print(cmd);

            DoByCommand(cmd);
        }
	}

    void OnDisable()
    {
        isRunningThread = false;
        udpClient.Close();
    }

    private void CreateUdpListener()
    {
        isRunningThread = true;

        udpClient = new UdpClient(ConfiInfo.UdpPort);
        thread_udpRecv = new Thread(ReciveMessages);
        thread_udpRecv.Start();
    }

    private void ReciveMessages()
    {
        while(isRunningThread)
        {
            try
            {
                IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, ConfiInfo.UdpPort);
                byte[] bytRecv = udpClient.Receive(ref remoteIpep);
                string message = System.Text.Encoding.Default.GetString(bytRecv, 0, bytRecv.Length);
                
                queue_udpMessage.Enqueue(message);
            }
            catch(System.Exception ex)
            {
                print(ex.Message);
                break;
            }
        }
    }

    private void DoByCommand(string cmd)
    {
        //string tmp = cmd.ToLower();

        switch(cmd)
        {
            case "TransPortPhoto": ReceivePhoto(); break;  //图片数据流的接收并显示
        }
    }

    private void ReceivePhoto()
    {
        Debug.Log("显示图片!");
    }
}

客户端代码如下:

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System;

public class Client : MonoBehaviour
{
    [SerializeField]
    private string fileName;

    private string pathPhoto;

    private Socket socket;
    private IPEndPoint serverPoint;

    // Use this for initialization
    void Start()
    {
        pathPhoto = Application.dataPath + ConfiInfo.pathPhoto;

        CreateCilent();
    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnDestory()
    {
        socket.Close();
    }

    public void TransPortPhotoMessage()    //发送数据
    {
        string pathFile = pathPhoto + fileName;
        TcpSendFileStream(pathFile);

        UdpSendMessage("TransPortPhoto");
    }

    private void TcpSendFileStream(string pathFile)   //发送文件数据流
    {
        print("EnterUdpSendFileStream");



        print("UdpSendFileStreamEnd");
    }

    private void UdpSendMessage(string message)   //发送字符串指令
    {
        try
        {
            byte[] bytBuffer = Encoding.UTF8.GetBytes(message);
            socket.SendTo(bytBuffer, serverPoint);
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
        }

        print(message);
    }

    private void CreateCilent()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        serverPoint = new IPEndPoint(IPAddress.Parse(ConfiInfo.serverIP), ConfiInfo.UdpPort);
        socket.Connect(serverPoint);
    }
}

Unity中使用UDP协议传输数据也是可以的。与TCP协议不同,UDP是一种无连接的协议,它不保证数据的可靠性和顺序性,但是传输效率较高。下面是一个简单的示例代码,展示了如何在Unity中使用UDP协议传输数据: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using UnityEngine; public class UDPClient : MonoBehaviour { private UdpClient client; private IPEndPoint serverEndPoint; private void Start() { ConnectToServer("127.0.0.1", 8888); // 连接到服务器的IP和端口 } private void ConnectToServer(string serverIP, int serverPort) { try { client = new UdpClient(); serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); } catch (Exception e) { Debug.Log("连接服务器失败:" + e.Message); } } private void SendMessageToServer(string message) { try { byte[] data = Encoding.ASCII.GetBytes(message); client.Send(data, data.Length, serverEndPoint); Debug.Log("发送消息到服务器:" + message); } catch (Exception e) { Debug.Log("发送消息时发生错误:" + e.Message); } } private void ReceiveMessageFromServer() { try { IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] receivedData = client.Receive(ref remoteEndPoint); string receivedMessage = Encoding.ASCII.GetString(receivedData); Debug.Log("收到服务器消息:" + receivedMessage); } catch (Exception e) { Debug.Log("接收数据时发生错误:" + e.Message); } } private void OnDestroy() { if (client != null) client.Close(); } // 示例使用的按钮点击事件 public void SendButtonOnClick() { SendMessageToServer("Hello, Server!"); } // 示例使用的按钮点击事件 public void ReceiveButtonOnClick() { ReceiveMessageFromServer(); } } ``` 以上示例代码是一个简单的UDP客户端,它通过UdpClient与指定的服务器IP和端口建立连接,并可以发送和接收数据。需要注意的是,UDP是无连接的协议,因此发送时需要指定目标服务器的IP和端口,接收时也需要获取发送方的IP和端口。你可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值