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

相关文章

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

php中json_decode()和json_encode()

1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json

如何将文件夹里的PHP代码放到一个文件里

find ./dir -name "*.php" -exec 'cat' {} \; > dir.out

PHP抓取网站图片脚本

方法一: <?phpheader("Content-type:image/jpeg"); class download_image{function read_url($str) { $file=fopen($str,"r");$result = ''; while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); re

PHP防止SQL注入详解及防范

SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的

PHP防止SQL注入的方法(2)

如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE”); DROP TA

PHP防止SQL注入的方法(1)

(1)mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='". mysql_r