1. 程式人生 > >Unity3d遊戲客戶端與Photon伺服器資料通訊

Unity3d遊戲客戶端與Photon伺服器資料通訊

本文在上一篇博文的基礎上繼續介紹使用Unity3d遊戲客戶端與Photon Server資料通訊

開啟Unity3d2017,新建專案,在Asset目錄下新建Plugins資料夾

找到Photon SDK目錄下的lib檔案PhotonUnity3D.dll檔案,將其拖動到Unity Plugins目錄下


新建一個指令碼,這裡我命名為GamContext,將其掛載到場景空物件中

using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using ExitGames.Client.Photon;

public class GameContext : MonoBehaviour,IPhotonPeerListener
{
    private PhotonPeer peer;

    public void DebugReturn(DebugLevel level, string message)
    {       
    }

    //接收伺服器發來的事件
    public void OnEvent(EventData eventData)
    {
        switch (eventData.Code)
        {
            case 0:
                //獲取事件資料
                object value = eventData.Parameters.FirstOrDefault(q => q.Key == 1).Value;

                Debug.Log(value.ToString());

                break;
            default:
                break;
        }
    }

    //接收響應資料(客戶端傳送了請求)
    public void OnOperationResponse(OperationResponse operationResponse)
    {
        int operationCode = operationResponse.OperationCode;
        switch (operationCode)
        {
            case 0:
                //讀取資料包
                Dictionary<byte, object> responsedata = operationResponse.Parameters;
                object value = responsedata.FirstOrDefault(q => q.Key == 1).Value;

                Debug.Log(value.ToString());
                break;
            default:
                break;
        }
    }

    //連線狀態傳送改變
    public void OnStatusChanged(StatusCode statusCode)
    {
        Debug.Log("資料連線狀態發生的改變:" + statusCode);
    }

    private void Start()
    {
        //傳輸協議UDP 、 通過Listener接收伺服器端的響應
        peer = new PhotonPeer(this, ConnectionProtocol.Udp);
        //連線本地伺服器
        peer.Connect("127.0.0.1:5055", "MYGameServer");

        GameObject.Find("SendRequest").GetComponent<Button>().onClick.AddListener(()=> {

            //傳輸資料
            Dictionary<byte, object> myData = new Dictionary<byte, object>();
            myData.Add(1,"劉俊良");
            myData.Add(2, 20);

            //向伺服器傳送資料請求
            peer.OpCustom(0, myData, true);
        });
    }

    private void Update()
    {
        //和伺服器實時保持資料連線
        peer.Service();    
    }

    private void OnDestroy()
    {
        if (peer != null && peer.PeerState == PeerStateValue.Connected)
        {
            //斷開連線
            peer.Disconnect();
        }
    }
}

同時在伺服器端中的ClientPeer類中對資料請求函式進行修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;

namespace MyGameServer
{
    class ClientPeer : Photon.SocketServer.ClientPeer
    {
        public ClientPeer(InitRequest ir) : base(ir) { }

        //該客戶端斷開連線
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            
        }

        //該客戶端出操作請求
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            /*****解析客戶端請求資料*****/
            ReadRequestData(operationRequest);
            /****************************/

            /*****向客戶端傳送響應*****/
            OperationResponse operationResponse = new OperationResponse();
            operationResponse.OperationCode = 0;
            //資料包
            operationResponse.Parameters = new Dictionary<byte, object> { { 1, "資料提交成功" } };
            //向客戶端傳送請求響應
            SendOperationResponse(operationResponse, sendParameters);
            /**************************/

            /*****向客戶端傳送事件*****/
            EventData eventData = new EventData(0, new Dictionary<byte, object> { { 1, "伺服器事件" } });
            SendEvent(eventData, new SendParameters());
            /**************************/
        }

        private void ReadRequestData(OperationRequest operationRequest)
        {            
            int operationCode = operationRequest.OperationCode;
            switch (operationCode)
            {
                case 0:
                    Dictionary<byte, object> requestData = operationRequest.Parameters;
                    object value1 = requestData.FirstOrDefault(q => q.Key == 1).Value;
                    object value2 = requestData.FirstOrDefault(q => q.Key == 2).Value;

                    MyGameServer.LOG.Info("資料一:" + value1 + "資料二:" + value2);
                    break;
                default:
                    break;
            }
        }
    }
}


重新生成專案

開啟PhotonServer,開啟MyGameServer

執行Unity3d,點選按鈕,向伺服器傳送請求

此時Debug正常列印,檢視MyGameServer.log日誌檔案也正常輸出

這裡我總結了下客戶端與伺服器端資料互動流程,如圖所示


相關推薦

Unity3d遊戲客戶Photon伺服器資料通訊

本文在上一篇博文的基礎上繼續介紹使用Unity3d遊戲客戶端與Photon Server資料通訊開啟Unity3d2017,新建專案,在Asset目錄下新建Plugins資料夾找到Photon SDK目錄下的lib檔案PhotonUnity3D.dll檔案,將其拖動到Unit

cocos2d-x客戶Java伺服器通訊(一)

(⊙o⊙)…貌似自己已經有一段時間沒有寫部落格了,其實主要原因還是覺得自己水平有限,加上上班實在是太忙,實在抽不出時間來寫部落格。言歸正傳,大家都知道,在網路遊戲開發中, 網路通訊一直是個比較大的難題,一個伺服器可能要同時處理幾千上萬甚至上百萬的使用者資料,當然,僅僅是通訊

android客戶php伺服器的json資料簡單互動(二)

上一篇文章講的是最簡單的通過接送的格式完成android客戶端與php伺服器互動,也就是通過JSONObject物件來進行互動。         從上篇的文章程式碼就可以看出來,如果php陣列僅僅採用鍵值對的方式進行儲存,通過很簡單的方式轉換為json格式,之後在andr

XMPP學習——Android客戶openfire伺服器單雙向TLS通訊

本文從TLS安全傳輸層協議的簡單流程、如何生成自簽名CA證書、自頒發伺服器&客戶端證書、配置openfire伺服器安全連線去描述如何建立一個使用TLS加密的XMPP聊天通道。 這裡的smack版本是V4.2.3,openfire伺服器版本也是V4.2.3

關於客戶資料庫伺服器的時間同步問題

這是一個做C/S的管理軟體開發時經常被忽略的問題,客戶端的時間與伺服器的時間如果有偏差,資料統計、報表等等肯定會有“意外”的情況發生。 意圖很簡單:從資料庫伺服器獲取到時間,根據這個時間修改當前客戶端電腦時間。 用Sql的函式getdate(),是比較容易的。 我們是基於do

Android客戶PC伺服器實現Socket通訊(wifi)

本文介紹Android終端持續掃描AP資訊併發送給伺服器端的實現。首先基於TCP協議在Android終端和PC兩端之間形成網路虛擬鏈路。使用ServerSocket建立TCP伺服器端,然後在Android客戶端使用Socket的構造器來連線伺服器。其中Android終端通過WIFI連線和PC處於同一區域網

實現Android客戶Eclipse伺服器基於Okthhp簡單通訊

最近在重溫知識,所以藉此機會也想把自己寫的一些心得寫出來供大家分享,寫的有誤或者不好的地方望大家見諒,好了,廢話少說,直接進入正題,下面給大家介紹的就是基於目前主流網路通訊框架的okhttp實現的Android與Eclipse通訊。首先說明:我用的Android客戶端是And

Android客戶Tomcat伺服器通訊實現登入驗證

一.功能描述   在Android客戶端實現登入介面,當將使用者名稱和密碼填入文字框並點選登入按鈕時,將認證資訊傳送至Tomcat伺服器進行認證,若使用者名稱和密碼匹配,則Android客戶端提示登入成功,否則提示登陸失敗。 二.開發環境 Android客戶端:Andro

Android客戶伺服器進行網路通訊

多寫技術文件,多寫技術文件,多寫技術文件,重要的事情說三遍...... ---------------------------------------------------------------------------------------------------

android客戶servlet伺服器互動簡單示例

前段時間需要寫一個能雙向解析XML的程式,但是客戶端只能從伺服器裡讀,但是死活傳不上去,倒騰了兩天終於搞好了。 下面直接貼示例程式碼,不明白的話再問吧。 這是android客戶端,記得得在AndroidManifest.xml檔案裡新增INTENET許可權。 publ

PHP客戶C#伺服器 Socket通訊

using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace UpdServer

Android客戶java伺服器的Socket連線

開發十年,就只剩下這套架構體系了! >>>   

Android客戶PC進行Socket通訊

伺服器端程式碼: import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Si

【隨堂筆記】unity中socket的用法(二、伺服器客戶之間簡單的資料傳遞)

主要實現伺服器與客戶端之間簡單的資料傳輸(單次) 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program {

java利用socket實現客戶伺服器的連線資料傳遞

網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個雙向鏈路的一端稱為一個 socket。socket 也就是套接字,可以用來實現不同虛擬機器或者不同計算機之間的通訊。在 Java 語言中,socket 可以分為兩種型別:面向連線的 socket 通訊協議(TCP)和麵向無連線的 socket

分散式資料庫資料從屬客戶伺服器資料同步

老實說,目前市面上許多產品,的確是不成熟的產品。 用過一些,給人蛋痛的感覺。 導言分佈還是集總今天我們來探討一個很重要的問題。每個程式設計師都有其思想,我的思想之一,就是分散式。 分散式,面對的一個問題,就資料的同步。 比如說,我們人類是分散式的,我們每個細胞都在無時無刻與其它細腦交換資料。 而現實

伺服器客戶使用Json進行資料互動

伺服器端: 引入相應的包:json-lib-2.2-jdk15.jar Action: public String findAll() throws IOException{ List<News> news = newsService.findAll(); //

通俗易懂客戶伺服器互動原理(HTTP資料請求HTTP響應,包括Servlet部分)

經常看到HTTP客戶端與伺服器端互動原理的各種版本的文章,但是專業術語太多,且流程過於複雜,不容易消化。於是就按照在 Servlet 裡面的內容大致做了一些穿插。本來 連 Tomcat 容器 和 Servlet 的生命週期也準備在這裡一起寫的,但怕過去龐大,於是就簡單的 引用

Android 客戶伺服器進行資料互動(一、登入伺服器

概要 安卓APP要實現很多功能(比如登入註冊、發表評論等)時都必須要使用到網路資料互動。所以在學習了這部分內容後,就將其以最常見的登入過程為例整理出來,也方便跟我一樣的新手能迅速學習上手。 預期效果圖如下,輸入手機號和密碼,點選Login按鈕,上傳資料到伺

Android客戶伺服器的json資料互動(很詳細)

      Android客戶端與伺服器端的json資料互動,主要是通過json形式的資料互動,就是json的寫入和解析。  先看效果圖,我最討厭講東西,一個圖沒有的。 算了,看來我不是寫部落格的材料,寫不下去了,要排版之類的麻煩,大家還是直接去下載原始碼,裡面有大量的注