2014-09-26 3 views
0

В последней версии (4.5.4) Unity3D можно ли отменить ожидающий запрос WWW-класса (HTTP) и закрыть его сокет/соединение? Я пробовал myWWWObject.Dispose, по крайней мере, в режиме воспроизведения в редакторе, и он не работает.Unity WWW отменить запрос и закрыть розетку/соединение

This forum post on Unity forums имеет противоречивые ответы. Один человек говорит, что это работает, тогда другой говорит, что это не так, но ответ, который они дают, заставляет меня думать, что они только заботятся о возобновлении сопрограммы и не закрывают фактическое соединение.

Я пишу игру, которая должна работать на iOS, Android и Facebook Canvas (веб-плеер), и я использую длинный опрос на моем собственном сервере. Есть моменты, когда я хочу отменить существующий опрос и опубликовать новый. В некоторых случаях (вид нечетного поведения, но возможно) пользователь может привести к тому, что это произойдет много раз подряд. Я не хочу, чтобы все эти соединения оставались открытыми на моем сервере или на стороне клиента, хотя мой код не мог игнорировать любой результат/ответ.

Возможно, я смогу обойти это с изменениями дизайна, но скорее не буду, если есть надежный способ закрыть/отменить/прервать/остановить запрос. Я уверен, что все 3 платформы, которые мне нужны для поддержки, имеют способы сделать это изначально, но не уверены, что я хочу использовать родные плагины вместо WWW-класса.

ответ

1

Я не совсем уверен, но я думаю, что когда вы хотите закрыть соединение сокета, вы опускаетесь до уровня TCP/IP или UDP. Насколько я знаю, вы не контролируете этот слой из объекта WWW gameObject. Так что технически, даже если вы отмените «передачу», сокет должен будет дождаться отключения тайм-аута TCP/IP ОС ... Я думаю ...

Я нашел эту ссылку, которая может пролить некоторые свет в вашем конкретном выпуске: http://answers.unity3d.com/questions/676443/wwwdispose-doesnt-work.html

Все еще я думаю, что .Dispose() может все еще не закрыть фактический сокет, как вы хотите. Только в том случае, если вы напрямую обращаетесь через Thread, TcpListener и TcpClient, вам разрешается выдавать фактический сокет close().

Как, например:

TcpListener myTcpListener; 
TcpClient myTcpClient; 

void OnApplicationQuit() 
{ 
    try 
    { 
     myTcpClient.Close(); 
     isTrue = false; 
    } 
    catch(Exception e) 
    { 
     Debug.Log(e.Message); 
    } 

    // You must close the tcp listener 
    try 
    { 
     myTcpListener.Stop(); 
     isTrue = false; 
    } 
    catch(Exception e) 
    { 
     Debug.Log(e.Message); 
    } 
} 
+0

Лентяй, но спасибо. Мне, возможно, придется снова исследовать, но я не думаю, что TcpClient хорошо работает в кросс-платформе, поэтому я использую WWW в первую очередь. Возможно, я добавлю это как запрос функции, было бы неплохо, если бы WWW-класс мог его поддерживать. – eselk

Смежные вопросы