Answer the question
In order to leave comments, you need to log in
Scene hangs while receiving a message from the server, what should I do?
Hello! There is this script in Unity:
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);
}
}
bytes = socket.Receive(buffer); // Прием данных от сервера !!! вот из за этой строчки вся сцена виснет, и я не знаю, как сделать получение сообщений с сервера асинхронным, что бы, сцена не висла.
Answer the question
In order to leave comments, you need to log in
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);
}
}
}
}
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*
.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question