Страница 1 из 2

Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 26 мар 2012, 22:18
Nolex
Сразу скажу, особенность этого php-чата в том, что он обновляется только когда есть новые сообщения в чате. В то время, как обычные php-чаты, посылают запросы обновления каждые 2-3 секунды, независимо от того, если ли новые сообщение, или нету.

Вы спросите, "как это работает"? А работает оно по технологии Comet(длительные http-запросы).
Подробнее: _http://ru.wikipedia.org/wiki/Comet_(программирование)

В итоге, мы с камрадом gnoblin`ом, установили этот чат и запустили под Юнити. Все оказалось очень просто. :)

Исходники чата, пример портирования в Юнити

Сам PHP-чат на Comet бесплатно берем тут: http://www.zeitoun.net/articles/comet_and_php/start
Ставим чат, выставляем права на data.txt. Тут все просто. Когда настроили чат,пробуем запустить, он должен работать через браузер. Теперь остаётся подключить его к Юнити3д.

Вот скрипт на C#:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
 
[System.Serializable]
public class ChatResponse
{
    public string msg;
    public long timestamp;
}
 
public class CometTest : MonoBehaviour
{
    string db_url = "http://nolex.biz/chat/backend.php";
 
    long last_timestamp = 0;
    WWW comet_www;
    void Start()
    {
        comet_www = new WWW(db_url + "?timestamp=" + last_timestamp);
        StartCoroutine(WaitingForResponse(comet_www, ParseResponse));
    }
 
 
    string chat_msg = "";
 
 
    List<string> message_list = new List<string>();
 
    void OnGUI()
    {
 
        chat_msg = GUILayout.TextField(chat_msg, GUILayout.Width(150));
 
        if (GUILayout.Button("send"))
        {
            if (chat_msg != "")
            {
               // message_list.Add(chat_msg);
                StartCoroutine(WaitingForResponse(new WWW(db_url + "?msg=" + chat_msg), null));
            }
        }
         
        for(int i=0; i<message_list.Count; i++)
        {
            GUILayout.Label(message_list[i]);
        }
    }
 
    void OnApplicationQuit()
    {
        if (comet_www != null)
        {
            comet_www.Dispose();
            comet_www = null;
        }
    }
 
    void ParseResponse(string text)
    {
        if (text.Contains("{"))
        {
            JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader(text);
            ChatResponse r = reader.Deserialize<ChatResponse>();
            Debug.Log(string.Format("msg: {0}, timestamp: {1}", r.msg, r.timestamp));
            last_timestamp = r.timestamp;
            message_list.Add(r.msg);
            comet_www = new WWW(db_url + "?timestamp=" + last_timestamp);
            StartCoroutine(WaitingForResponse(comet_www, ParseResponse));
        }
        else
        {
            Debug.Log("strange response");
        }
    }
 
    public IEnumerator WaitingForResponse(WWW www, RequestCallback callback)
    {
 
        //Debug.Log("" + Time.time);
        yield return www; // ожидаем пока получим с сервера данные
        //Debug.Log("" + Time.time);
 
        if (www.error == null)
        {
            //Debug.Log("Successful.");
        }
        else
        {
            Debug.Log("Failed.");
        }
 
        if (callback != null)
        {
            callback(www.text);
            callback = null;
        }
 
        //Очищаем данные
        www.Dispose();
        www = null;
    }
 
    public delegate void RequestCallback(string str);
 
    void DebugResponse(string s)
    {
        Debug.Log(string.Format("RESPONSE: {0}", s));
    }

}
//gnoblin
 


Онлайн-пример работы php-чата

- Стандартная браузерная версия: http://nolex.biz/chat/
- Веб-сборка на Unity3d: http://nolex.biz/chat/WebPlayer.html

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 29 мар 2012, 17:28
mCoder
Можете скинуть пожалуйста исходник в файле...?
А то этот не хочет работать, выдает что в нем ошибки...(

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 29 мар 2012, 21:08
mCoder
Вот скрин:
sc.PNG

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 29 мар 2012, 21:16
Nolex
Форум автозаменой поставил "http://", убери и все заработает.

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 06 окт 2012, 01:31
V0odo0
Назрел вопросик по теме. Все сообщения, которые отправляются из юнити скрипту backend.php обрезаются после первого пробела, т.е. отправляем "Привет мир!", а приходит "Привет". В случае с веб версией все пробелы проходят. В чем может быть проблема?

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 06 окт 2012, 04:34
gnoblin
WWW.EscapeURL()/UnEscapeURL() попробуй перед отправкой

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 22 окт 2012, 23:46
Ninjaschioice
данная реолизация подойдёт для ммо проекта?

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 24 мар 2013, 10:57
JIeo_NEED
Помогите, пожалуйста! Работает с огромными косяками.

На странице вроде работает, но тоже часто случаются лаги, когда сообщения просто пропадают.
А в игре - вообще, два сообщения отправятся, и ошибки в консоли.

    1. 400 Bad Request
    2. You are trying to load data from a www stream which had the following error when downloading.
    3. 500 Internal Server Error



А иногда пишет "Successful", но при этом сообщения не выводятся...

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 24 мар 2013, 11:55
Nolex
JIeo_NEED писал(а):Помогите, пожалуйста! Работает с огромными косяками.

    1. 400 Bad Request
    2. You are trying to load data from a www stream which had the following error when downloading.
    3. 500 Internal Server Error

написано же в ошибке, что ты одновременно разу запросов делаешь используя WWW comet_www;
проверяй хотябы if (comet_www.isDone) перед отправкой

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 25 окт 2013, 13:21
1900Fast
привет, какой у тебя хостинг? просто не все хостинги тянут эту нагрузку и сбрасывают!

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 25 окт 2013, 14:40
Nolex
1900Fast писал(а):привет, какой у тебя хостинг? просто не все хостинги тянут эту нагрузку и сбрасывают!

Ну у меня сервачек за 30-40$, но это не важно. Должно работать на любом хосте по идее.

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 25 окт 2013, 15:42
Diab10
Nolex писал(а):А работает оно по технологии Comet(длительные http-запросы).


Т.е. соединение долго держит открытым? Так в апаче ограничено число соединений. Если превысит - будет тупить.
Я недавно с этим столкнулся на сервере - игроки долго качали файлы с сервера - количество соединений кончилось

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 25 окт 2013, 22:20
marikcool
не вариант ребята, на 100 человек еще пойдет, а вот на 1к уже сольется, ваш чат держит соединение так еще бэкенд апач точно положит.
сам текст хоть в чем хранится?

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 26 окт 2013, 01:09
Nolex
marikcool писал(а):не вариант ребята, на 100 человек еще пойдет, а вот на 1к уже сольется, ваш чат держит соединение так еще бэкенд апач точно положит.
сам текст хоть в чем хранится?

Сомневаюсь, что положит. На сколько я знаю, очень много всего юзают подобные технологии.
Пишет в txt файлик. По функционалу этот чат такой себе, его допиливать надо) Это больше как фо фан.

Можно смотреть в сторону IRC-чата. Есть бесплатные сервера, а на asset Store продается за 5-10 баксов инграция.

Re: Умный PHP-чат для Юнити, который работает через Comet!

СообщениеДобавлено: 19 окт 2014, 18:41
kolya9898
Очень полезное решение для тех кто ни-ни в IRC и подобных решениях.
(popcorn) (c#)
В принципе, жрет не много ресурсов, не знаю зачем кому-то нужно чаты на 20тыс и больше.... на одну систему. Когда на большие решения покупают хостинг для ресурсо ёмких задач