1. 程式人生 > >Unity利用UDP通訊(傳送字串)

Unity利用UDP通訊(傳送字串)

客戶端程式碼如下:
using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class UDPClient : MonoBehaviour
{
    public string recvStr;
    private string UDPClientIP;
    string str = "客戶端01傳送訊息";
    Socket socket;
    EndPoint serverEnd;
    IPEndPoint ipEnd;

    byte[] recvData = new byte[1024];
    byte[] sendData = new byte[1024];
    int recvLen = 0;
    Thread connectThread;

    void Start()
    {
        UDPClientIP = "168.178.2.11";//服務端的IP.自己更改
        UDPClientIP = UDPClientIP.Trim();       
        InitSocket(); 
    }

    void InitSocket()
    {
        ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), 7401);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        serverEnd = (EndPoint)sender;
        print("等待連線");
        SocketSend(str);
        print("連線");
        //開啟一個執行緒連線
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();
    }
    void SocketSend(string sendStr)
    {
        //清空
        sendData = new byte[1024];
        //資料轉換
        sendData = Encoding.UTF8.GetBytes(sendStr);
        //傳送給指定服務端
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
    }

    //接收伺服器資訊
    void SocketReceive()
    {
        while (true)
        {

            recvData = new byte[1024];
            try
            {
                recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
            }
            catch (Exception e)
            {
            }

            print("資訊來自: " + serverEnd.ToString());
            if (recvLen > 0)
            {
                recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
            }

            print(recvStr);
        }
    }

    //連線關閉
    void SocketQuit()
    {
        //關閉執行緒
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最後關閉socket
        if (socket != null)
            socket.Close();
    }
    void OnApplicationQuit()
    {
        SocketQuit();
    }

    void Update()
    {

    }

}

伺服器程式碼如下:

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

public class UDPServer : MonoBehaviour
{
    public string ipAddress = "168.178.2.11";
    public int ConnectPort = 7401;
    public string recvStr;

    Socket socket;
    EndPoint clientEnd;
    IPEndPoint ipEnd;
    string sendStr;
    byte[] recvData = new byte[1024];
    byte[] sendData = new byte[1024];
    int recvLen;
    Thread connectThread;
    //初始化
    void InitSocket()
    {
        ipEnd = new IPEndPoint(IPAddress.Parse(ipAddress), ConnectPort);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket.Bind(ipEnd);
        //定義客戶端
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        clientEnd = (EndPoint)sender;
        print("等待連線資料");
        //開啟一個執行緒連線
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();
    }
    void SocketSend(string sendStr)
    {
        sendData = new byte[1024];
        sendData = Encoding.UTF8.GetBytes(sendStr);
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, clientEnd);
    }
    //伺服器接收
    void SocketReceive()
    {
        while (true)
        {
            recvData = new byte[1024];
            recvLen = socket.ReceiveFrom(recvData, ref clientEnd);
            recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
            Debug.Log("收到得資訊 " + recvStr);           
        }
    }

    //連線關閉
    void SocketQuit()
    {
        //關閉執行緒
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最後關閉socket
        if (socket != null)
            socket.Close();
        Debug.LogWarning("斷開連線");
    }

    // Use this for initialization
    void Start()
    {
        InitSocket(); //在這裡初始化server
    }

    void OnApplicationQuit()
    {
        SocketQuit();
    }

}

對UDP通訊使用比較頻繁,還有傳送內容不僅僅侷限在字串,有時候還會發送結構體,以及Json格式的資料,具體的接收到的資訊解析方法要根據協議來解析。

相關推薦

Unity利用UDP通訊(傳送字串)

客戶端程式碼如下:using UnityEngine; using System.Collections; using System; using System.Net; using System.Net.Sockets; using System.Text; using

【Android開發—智慧家居系列】(四):UDP通訊傳送指令

【Android開發—智慧家居系列】(四):UDP通訊傳送指令   思路回顧 【1】手機連線WIFI模組  【2】UDP通訊對WIFI模組傳送指令,以和WIFI模組保持連線狀態  【3】UDP通訊對WIFI模組傳送指令,讓其搜尋可用的無線網,返回WIFI列表

unity中用UDP實現傳送訊息機制

首先,用Unity新建兩個專案,然後一個寫Server,另一個寫Client。`using UnityEngine; using System.Collections; //引入庫 using System.Net; using System.Net.S

26 API-網路程式設計(網路概述,Socket通訊機制,UDP協議傳送和接收資料,TCP協議傳送和接收資料)

1:網路程式設計(理解) (1)網路程式設計:用Java語言實現計算機間資料的資訊傳遞和資源共享(2)網路程式設計模型 l網路模型一般是指 OSI(Open System Interconnection開放系統互連)參考模型 TCP/IP參考模型 (3)網路程式

微控制器利用串列埠通訊傳送溫度

/********該程式主要是利用DS18B20採集溫度,然後通過數碼管顯示溫度*************/ /*當程式收到上位機發送的命令之後,該程式會將當時的溫度值通過串列埠傳送給上位機*/ #i

【iOS】Socket/TCP 通訊 傳送 NSString 字串格式資料

Socket/TCP 原理這裡就不闡述了,網上一搜一大堆,直接上關鍵程式碼。 【注】iOS 目前有非常著名的第三方庫 CocoaAsyncSocket 可以使用,但是我們專案當時做大資料上報要求直接傳送 NSString 格式資料,所以自己寫了一個簡易版 TCP 連線,

MFC中利用CSocket實現UDP通訊

     原始碼請到此處下載。 基本介面如下:                          UDP通訊時雙方地位是對等的,不用像TCP那樣要在伺服器端設定一個監聽Socket。      第一

Unity 與C#伺服器 實現Socket的UDP通訊(多客戶端)

前言 上一篇簡單的介紹了下Unity客戶端和伺服器的Socket通訊,但是還不能實現多個客戶端與伺服器的通訊,所以今天在這邊把前面的工程完善一下(使用的是上篇講到的UdpClient類來實現),實現多個客戶端與伺服器的udp通訊。效果圖如下,兩個客戶端可以向伺服器傳送訊息,

Qt學習之路十二——利用UDP進行通訊

一、UDP的特點UDP(使用者資料報協議)是一種簡單輕量級、不可靠、面向資料報,無連線的傳輸層協議。而TCP/IP協議卻是有連線的二、UDP適合應用的幾種情況1、網路資料大多為短訊息2、擁有大量客戶端3、對資料安全性無特殊要求4、網路負擔非常重,但對響應速度要求高。三、利用U

python 將字串轉化成16進位制進行UDP傳送

轉載自:Python UDP Socket 16進位制資料傳送 | 北京小芽科技http://xiaoyatec.com/2015/12/08/python-udp-socket-16%E8%BF%9B%E5%88%B6%E6%95%B0%E6%8D%AE%E5%8F%91

Unity&網路:利用UDP實現動態監測區域網線上使用者及掉線事件。

概念: 伺服器-客戶端:一個抽象軟體概念。客戶端向伺服器傳送請求,伺服器根據請求給客戶端以服務。並非指一臺電腦。同一臺電腦可以利用多執行緒同時充當伺服器與客戶端的角色。有點像記者釋出會上的一問一答。 P2P:一個電腦既是客戶端也是伺服器。對於對方發來的請求可

QUdpSocket-Qt使用Udp通訊實現服務端和客戶端

array tle sig post 客戶端 種類型 可用 進行 += 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QUdpSocket-Qt使用Udp通訊實現服務端和客戶端 本文地址:http://t

java 實現udp通訊

ket 地址 upd void ESS util dst 服務端 unknown 需求:應用A(通常有多個)和應用B(1個)進行 socket通訊,應用A必須知道應用B的ip地址(在應用A的配置文件中寫死的),這個時候就必須把應用B的ip設成固定ip(但是某些時候如更換路由

RTOS_TINY中實現串列埠傳送字串控制LED

題目內容 在RTOS_TINY作業系統下實現以下目標: 有四個LED,使用AT89S52的4個引腳驅動它們分別以5Hz,8Hz,20Hz,32Hz的頻率閃爍。設使用12MHz的晶振。用串列埠助手,通過傳送 “TURN on 1”,使得LED1持續閃爍,並回顯“LED1 on”;傳送

socket-vs-udp-圖片傳送

結構體的傳送 UDP程式設計時經常需要使用sendto()和recvfrom()兩個函式,其中recvfrom()的函式原型是: ssize_t recvfrom( int sockfd, void *buf, size_t len, int flags,

Java UDP通訊聊天程式

 編寫兩個新的VC程式,完成以下功能:  一個程式為服務端,建立UDP服務端套接字。  另外一個程式為客戶端,建立UDP客戶端套接字。  這兩個新程式可以互聯,完成一個基於TCP/IP網路的文字聊天程式。 因為TCP需要三次握手,所以只能一來一回的實現聊天程式,而UDP可以只負責

[LeetCode]利用Double類完成字串轉整數 (atoi)

Double.parseDouble(String str) 能把一個String型別的變數轉換為Double型別,而且利用丟擲的異常我們還可以很好的處理無法轉換的字串,故其非常適合做atoi,而之所以不用Integer.parseInteger是因為我們可能

利用strrchr函式從字串中分離字元

比如在用FIFO寫單伺服器多使用者的程式中,要分離出使用者請求行中的路徑,可以用strrchr函式。 #include <string.h> 函式原型:extern char * strrchr (const char *s, int c) 引數說明:s為一個字串的指標,c為

如何利用UDP協議封裝一個數據包

  在如何封裝一個數據包上,是一個非常細緻的問題,而利用UDP協議來封裝的話,是比較簡單,讓我們一步步來分析典型的TCP/IP協議。一般來說一個典型的一個數據包,包括乙太網MAC頭+網路層IP資料頭+傳輸層UDP頭+要傳輸的資料。讓我們一層層來看看這些資料頭是如何構成的。    1、乙太網MAC頭   

Node.js使用UDP通訊

Node.js 的 dgram 模組可以方便的建立udp服務,,以下是使用 dgram模組建立的udp服務和客戶端的一個簡單例子。 一、建立 UDP Server var dgram = require('dgram'); //建立 udp server var udp_server = dgram.cr