美文网首页征服Unity3dunity3D技术分享
Unity5.4 通过PHP连接数据库与Socket服务器

Unity5.4 通过PHP连接数据库与Socket服务器

作者: 白水SR | 来源:发表于2017-10-20 16:49 被阅读213次

公司给一个项目要求程序发布WebGL端同时连接pgSQL与Socket服务器,因为Unity WebGL是无法连接数据库与Socket通讯的,所以就通过PHP作为中间转接层来获取数据,代码如下:

注:PHP需要搭建环境,推荐Wampserver。

GitHub:https://github.com/baishuisr1/-Unity-Connect-the-pgSQL-with-the-Socket-server-via-PHP

演示(由于PHP不支持多线程,所以是间隔时间来获取数据):


Unity PHP连接服务器.gif

数据库截图:


%E6%88%AA%E5%.png
服务器代码:
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Xml;


namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();
            program.StartServer();
            Console.ReadKey();
        }

        void StartServer() //服务器异步连接
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAddress = IPAddress.Parse("x.x.x.x"); //设置IP
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,xxxx); //设置IP和端口号
            socket.Bind(ipEndPoint); //绑定IP和端口号
            socket.Listen(0); //开始监听客户端
            socket.BeginAccept(AcceptCallBack, socket); //通过BeginAccept进行异步连接
            Console.ReadKey();
        }

        void AcceptCallBack(IAsyncResult ar)
        {
            Console.WriteLine("有一个客户端连接了");
            Socket socket = ar.AsyncState as Socket;
            Socket clientSocket = socket.EndAccept(ar);
            //向客户端发送一条消息
            string date = "服务器连接成功";
            byte[] msg = System.Text.Encoding.UTF8.GetBytes(date);
            clientSocket.Send(msg);
            clientSocket.BeginReceive(dateBuffer, 0, 1024, SocketFlags.None, ReceiveCallBcak, clientSocket);
            socket.BeginAccept(AcceptCallBack, socket);
        }

        static byte[] dateBuffer = new byte[1024];
        private int i=1;
        void ReceiveCallBcak(IAsyncResult ar) //事件,ar传递值
        {
            Socket clientSocket = null;
            try
            {
                clientSocket = ar.AsyncState as Socket;
                int count = clientSocket.EndReceive(ar);
                string msg = Encoding.UTF8.GetString(dateBuffer, 0, count);//获取客户端发来数据
                Console.WriteLine("客户端发送消息:" + msg);
                i++;
                Thread.Sleep(2000);//等待2秒再次发送数据
                byte[] date = Encoding.UTF8.GetBytes(i.ToString());
                clientSocket.Send(date);//发送数据
                Console.WriteLine("服务器发送数据:" + Encoding.UTF8.GetString(date));
                clientSocket.BeginReceive(dateBuffer, 0, 1024, SocketFlags.None, ReceiveCallBcak, clientSocket);
            }
            catch (Exception)
            {
                Console.WriteLine("客户端断开连接");
            }
        }
    }
}

PHP代码:

<?php
//连接数据库
$conn = pg_connect("host=127.0.0.1 port=5432 dbname=xxxxx user=postgres password=xxxxx");
$str = "select * from \"Test\"";
$ret = pg_query($conn,$str);
while($row = pg_fetch_row($ret)){
    echo $row[0];//输出数据库ID[1]
    echo $row[1];//输出数据库ID[2]
}
//连接SOCKET
$host = "x.x.x.x";
$port= "xxxx";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result=socket_connect($socket,$host,$port);
    $budder=@socket_read($socket,1024);//接受Scket数据
    echo $budder;
    $userid=$_POST['msg'];//获取unity发来数据
    socket_write($socket,$userid); //将unity数据发送到socket
    $budder=@socket_read($socket,1024);//重新接受unity数据
    echo $budder;
socket_close($socket);
?>  

Unity 代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    public GameObject text;
    // Use this for initialization
    void Start()
    {
        StartCoroutine(IGetData());
    }

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

    }

    IEnumerator IGetData()
    {
        while (true)
        {
            WWWForm form = new WWWForm();
            form.AddField("msg", "Server");//设置发送数据
            WWW www = new WWW("http://127.0.0.1/index.php", form);//下载与上传数据
            yield return www; //等待Web服务器
            text.GetComponent<Text>().text = www.text;
            Debug.Log(www.text);
        }

    }
}

相关文章

网友评论

    本文标题:Unity5.4 通过PHP连接数据库与Socket服务器

    本文链接:https://www.haomeiwen.com/subject/lfxluxtx.html