S
S
Senture2019-01-06 00:46:54
C++ / C#
Senture, 2019-01-06 00:46:54

Scene hangs while receiving a message from the server, what should I do?

Hello! There is this script in Unity:

Script
internal bool connected = false;
    internal Socket socket;
    internal Dictionary<string, string> data= new Dictionary<string, string>();

    void FixedUpdate()
    {
        if (!connected)
            return;

        try
        {
            int bytes = 0; // Счетчик полученных байт с сервера
            byte[] buffer = new byte[1024]; // Массив байт, для данных полученых с сервера

            StringBuilder builder = new StringBuilder();

            do
            {
                bytes = socket.Receive(buffer); // Прием данных от сервера !!! вот из за этой строчки вся сцена виснет, и я не знаю, как сделать получение сообщений с сервера асинхронным, что бы, сцена не висла.
                builder.Append(Encoding.UTF8.GetString(buffer, 0, bytes)); // Строим сообщение из полученных данных ( массива байт )
            }
            while (socket.Available > 0);

            string[] allInfo = builder.ToString().Split(';');
            for (int i = 0; i < allInfo.Length; i++)
            {
                string[] info = allInfo[i].Split('|');
                data.Add(info[0], info[1] + '|' + info[2] + '|' + info[3]);
            }
        }
        catch (Exception ex)
        {
            Debug.Log("Error in Helper.FixedUpdate: " + ex.Message);
        }
    }


This is where the whole scene hangs.
bytes = socket.Receive(buffer); // Прием данных от сервера !!! вот из за этой строчки вся сцена виснет, и я не знаю, как сделать получение сообщений с сервера асинхронным, что бы, сцена не висла.

Who knows what can be done with this, please tell me how to solve this problem.
PS Thank you all so much!!

Answer the question

In order to leave comments, you need to log in

3 answer(s)
S
Senture, 2019-01-08
@Senture

Solved the problem like this:

void Start()
    {
        Thread t = new Thread(ReceiveData);
        t.Start();
    }

    private void ReceiveData()
    {
        while (true)
        {
            if (connected)
            {
                Debug.Log("Run");
                try
                {
                    int bytes = 0; // Счетчик полученных байт с сервера
                    byte[] buffer = new byte[1024]; // Массив байт, для данных полученных с сервера

                    StringBuilder builder = new StringBuilder();

                    do
                    {
                        bytes = socket.Receive(buffer); // Прием данных от сервера
                        builder.Append(Encoding.UTF8.GetString(buffer, 0, bytes)); // Строим сообщение из полученных данных ( массива байт )
                    }
                    while (socket.Available > 0);

                    string[] allInfo = builder.ToString().Split(';');
                    for (int i = 0; i < allInfo.Length; i++)
                    {
                        string[] info = allInfo[i].Split('|');

                        Action action = () => { data.Add(info[0], info[1] + '|' + info[2] + '|' + info[3]); };
                        action.Invoke(); 
                    }
                }
                catch (Exception ex)
                {
                    Debug.Log("Error in Helper.FixedUpdate: " + ex.Message);
                }
            }
        }
    }

Everything works fine =)
Many thanks to everyone!

F
freeExec, 2019-01-06
@freeExec

Where did you get this script, it's just a bunch of classic mistakes
1) What does the network stack in physical ticks have to do to run it in FixedUpdate
2) Why create a buffer and StringBuilder for each update
Asynchronous methods start with Begin*.

P
p4p, 2019-01-06
@p4p

The scene freezes as it waits for data to arrive. Such operations are not performed on the main thread.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question