Unity CocosCreator PHP WebSocket 三方会谈

2024-01-06 10:20

本文主要是介绍Unity CocosCreator PHP WebSocket 三方会谈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果预览: 

 

PHP 服务器:

<?php
/*** Created by xwx* Date: 2017/10/18* Time: 14:33*/class SocketService
{private $address = '0.0.0.0';private $port = 12345;private $_sockets;public function __construct($address = '', $port = ''){if (!empty($address)) {$this->address = $address;}if (!empty($port)) {$this->port = $port;}}public function service(){//获取tcp协议号码。$tcp = getprotobyname('tcp');$sock = socket_create(AF_INET, SOCK_STREAM, $tcp);socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);if ($sock < 0) {throw new Exception('failed to create socket: ' . socket_strerror($sock) . "\n");}socket_bind($sock, $this->address, $this->port);socket_listen($sock, $this->port);echo "listen on $this->address $this->port ... \n";$this->_sockets = $sock;}public function run(){$this->service();$clients[] = $this->_sockets;while (true) {$changes = $clients;$write = null;$except = null;socket_select($changes, $write, $except, null);foreach ($changes as $key => $_sock) {if ($this->_sockets == $_sock) {//判断是不是新接入的socketif (($newClient = socket_accept($_sock)) === false) {die('failed to accept socket: ' .socket_strerror($_sock) ."\n");}$line = trim(socket_read($newClient, 1024));$this->handshaking($newClient, $line);//获取client ipsocket_getpeername($newClient, $ip);$clients[$ip] = $newClient;echo "Client ip:{$ip}  \n";echo "Client msg:{$line} \n";} else {$len_read = socket_recv($_sock, $buffer, 2048, 0);if ($len_read === false) {// no data// echo 'no data' . PHP_EOL;// socket_close($_sock);// continue;} else {$msg = $this->message($buffer);$response = trim($msg);echo "{$key} clinet msg:", $response, "\n";//在这里业务代码foreach ($clients as $MySocket) {$this->send($MySocket, $response);}// echo "{$key} clinet msg:", $response, "\n";// $this->send($_sock, $response);// fwrite(STDOUT, 'Please input a argument:');// $response = trim(fgets(STDIN));// $this->send($_sock, $response);// echo "{$key} response to Client:".$response,"\n";}}}}}/*** 握手处理* @param $newClient socket* @return int 接收到的信息*/public function handshaking($newClient, $line){$headers = [];$lines = preg_split("/\r\n/", $line);foreach ($lines as $line) {$line = chop($line);if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {$headers[$matches[1]] = $matches[2];}}$secKey = $headers['Sec-WebSocket-Key'];$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));$upgrade ="HTTP/1.1 101 Web Socket Protocol Handshake\r\n" ."Upgrade: websocket\r\n" ."Connection: Upgrade\r\n" ."WebSocket-Origin: $this->address\r\n" ."WebSocket-Location: ws://$this->address:$this->port/websocket/websocket\r\n" ."Sec-WebSocket-Accept:$secAccept\r\n\r\n";return socket_write($newClient, $upgrade, strlen($upgrade));}/*** 解析接收数据* @param $buffer* @return null|string*/public function message($buffer){$len = $masks = $data = $decoded = null;$len = ord($buffer[1]) & 127;if ($len === 126) {$masks = substr($buffer, 4, 4);$data = substr($buffer, 8);} elseif ($len === 127) {$masks = substr($buffer, 10, 4);$data = substr($buffer, 14);} else {$masks = substr($buffer, 2, 4);$data = substr($buffer, 6);}for ($index = 0; $index < strlen($data); $index++) {$decoded .= $data[$index] ^ $masks[$index % 4];}return $decoded;}/*** 发送数据* @param $newClinet 新接入的socket* @param $msg  要发送的数据* @return int|string*/public function send($newClinet, $msg){$msg = $this->frame($msg);socket_write($newClinet, $msg, strlen($msg));}public function frame($s){$a = str_split($s, 125);if (count($a) == 1) {return "\x81" . chr(strlen($a[0])) . $a[0];}$ns = '';foreach ($a as $o) {$ns .= "\x81" . chr(strlen($o)) . $o;}return $ns;}/*** 关闭socket*/public function close(){return socket_close($this->_sockets);}
}$sock = new SocketService();
$sock->run();
?>

Unity 客户端:(Best HTTP/2 | Network | Unity Asset Store)依赖于BestHttp/2 v2.52版本

using BestHTTP.WebSocket;
using System;
using UniRx;
using UnityEngine;public class WebSocketTest : MonoBehaviour
{//公网// string address = "ws://xx.xx.xx.xx:12345/websockets.php";string address = "ws://127.0.0.1:12345/websockets.php";WebSocket webSocket;public void Start(){//Observable.EveryUpdate()//    .Where(_ => Input.GetKeyDown(KeyCode.Space))//    .Subscribe(_ =>//    {//        webSocket.Send("Unity Client!");//    }).AddTo(this);Init();}public void Update(){if (Input.GetKeyDown(KeyCode.Space)){webSocket.Send("Unity Client!");}}public void Init(){if (webSocket == null){webSocket = new WebSocket(new Uri(address));//#if !UNITY_WEBGL
//            webSocket.StartPingThread = true;
//#endif// Subscribe to the WS eventswebSocket.OnOpen += OnOpen;webSocket.OnMessage += OnMessageRecv;webSocket.OnBinary += OnBinaryRecv;webSocket.OnClosed += OnClosed;webSocket.OnError += OnError;// Start connecting to the serverwebSocket.Open();}}public void Destroy(){if (webSocket != null){webSocket.Close();webSocket = null;}}void OnOpen(WebSocket ws){Debug.Log("OnOpen: ");webSocket.Send("Unity Client!");}void OnMessageRecv(WebSocket ws, string message){Debug.LogFormat("OnMessageRecv: msg={0}", message);}void OnBinaryRecv(WebSocket ws, byte[] data){Debug.LogFormat("OnBinaryRecv: len={0}", data.Length);}void OnClosed(WebSocket ws, UInt16 code, string message){Debug.LogFormat("OnClosed: code={0}, msg={1}", code, message);webSocket = null;}void OnError(WebSocket ws, string reason){string errorMsg = string.Empty;
#if !UNITY_WEBGL || UNITY_EDITORif (ws.InternalRequest.Response != null){errorMsg = string.Format("Status Code from Server: {0} and Message: {1}", ws.InternalRequest.Response.StatusCode, ws.InternalRequest.Response.Message);}
#endifDebug.LogFormat("OnError: error occured: {0}\n", (reason != null ? reason : "Unknown Error " + errorMsg));webSocket = null;}
}

Cocos Creator:

// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.htmlconst {ccclass, property} = cc._decorator;@ccclass
export default class NewClass extends cc.Component {ws:WebSocket = null;start () {//局域网this.ws = new WebSocket("ws://127.0.0.1:12345/websockets.php");// 公网// this.ws = new WebSocket("ws://xxx.xx.xx.xx:12345/websockets.php");var self = this;// ws.send("0: Cocos Creator Client!");this.ws.onopen = function (evt) {console.log("Connection open ...");self.ws.send("0: Cocos Creator Client!");};this.ws.onmessage = function (evt) {console.log("Received Message: " + evt.data);//self.ws.close();};this.ws.onclose = function (evt) {console.log("Connection closed.");};//  setTimeout(function () {//     if (this.ws.readyState === WebSocket.OPEN) {//         this.ws.send("Hello WebSocket, I'm a text message.");//     }//     else {//         console.log("WebSocket instance wasn't ready...");//     }// }, 3);cc.systemEvent.on('keydown', this.onKeyPress, this);}onKeyPress(e: cc.Event.EventKeyboard) {if (e.keyCode == cc.macro.KEY.space) {cc.log( "空格键按下");this.ws.send("0: Cocos Creator Client!");}}
}

这篇关于Unity CocosCreator PHP WebSocket 三方会谈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576056

相关文章

PHP的基本语法有哪些?

PHP的基本语法包括以下几个方面: PHP标记:PHP脚本以<?php开始,以?>结束。这是PHP文件的默认文件扩展名是.php。 变量和常量:变量以$符号开头,其后是变量的名称。常量使用define()函数定义,例如define("常量名", 常量值);。 数据类型:PHP支持多种数据类型,如整型、浮点型、字符串型等。 注释:PHP支持单行注释(用//表示)和多行注释(用/* */表示

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中,片段着色器(Fragment Shader)是渲染管线中的一个阶段,负责计算屏幕上每个像素(片段)的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行,是决定最终像素颜色的关键步骤。 Fragment Shader的概念: 像素处理:片段着色器处理经过顶点着色器和几何着色器处理后,映射到屏幕空间的像素。颜色计算:它计算每个像素的颜色值,这可能包括纹理采样、光

【Unity Shader】Alpha Blend(Alpha混合)的概念及其使用示例

在Unity和图形编程中,Alpha Blend(也称为Alpha混合)是一种用于处理像素透明度的技术。它允许像素与背景像素融合,从而实现透明或半透明的效果。Alpha Blend在渲染具有透明度的物体(如窗户、玻璃、水、雾等)时非常重要。 Alpha Blend的概念: Alpha值:Alpha值是一个介于0(完全透明)和1(完全不透明)的数值,用于表示像素的透明度。混合模式:Alpha B

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

PHP生成csv格式Excel,秒级别实现excel导出功能

防止报超内存,兼容中文,兼容科学技术法。 爽。。。。很爽。。。。 /*** 告诉浏览器下载csv文件* @param string $filename*/public static function downloadCsv($data, $filename, $encoding = 'utf-8'){header("Content-type: text/csv");header("Conten

PHP 读取或生成大的Excel

场景,在很多情况下,需要读取Excel文件。 常用的有PHPExcel包或者使用 maatwebsite/excel 包 但是使用这个包读取或生成excel,如果excel文件过大,很容易出现超内存情况。 解决方法: 上传:要求上传者使用.csv 文件上传。然后使用php自带的 fgetcsv()函数来读取文件。http://php.net/manual/zh/function.fgetc

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr

PHP ODBC:连接数据库的桥梁

PHP ODBC:连接数据库的桥梁 PHP ODBC(Open Database Connectivity)是一个允许PHP应用程序连接到各种数据库管理系统的扩展。它为PHP提供了一个标准的数据库访问接口,使得开发者可以编写不依赖于特定数据库系统的代码。本文将详细介绍PHP ODBC的概念、工作原理、使用方法以及在实际开发中的应用。 什么是PHP ODBC? PHP ODBC扩展使得PHP能

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An