【问题标题】:tcp client can't connect to local server randomly in unitytcp客户端无法统一随机连接到本地服务器
【发布时间】:2015-06-04 12:39:12
【问题描述】:

我有一个使用 BeginConnect 连接本地服务器的 unity3d 客户端,但无法随机建立连接,尤其是在我重新启动统一编辑器后。连接好后,即使我多次重启游戏(不是编辑器)也会变得很正常。

wireshark 显示问题发生时没有发送任何内容。

我有另一个非常相似的客户端,但它可以非常完美地连接到我的另一个相似的本地服务器。

知道是什么导致了这个问题吗?

提前致谢。

===

PS。

  1. 即使使用重试机制,客户端也可以成功连接到服务器,但后面的异步操作(BeginSend & BeginReceive)可能仍然会随机停止工作。
  2. 即使我在未运行服务器的情况下运行客户端,连接也可能无响应。
  3. 我有代码可以在OnApplicationQuit() 函数中关闭套接字:

    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
    
  4. 另一个类似的客户端具有几乎相同的代码库,但运行良好。
  5. 我发现了另一个类似的问题:http://answers.unity3d.com/questions/925955/socketbeginwrite-no-response-in-463f1.html?sort=oldest。但它无法解释为什么我的另一个客户(相同版本的统一)工作。

【问题讨论】:

    标签: c# tcp unity3d client


    【解决方案1】:

    我们的大部分 TCP 相关问题都与未能关闭侦听器线程或未能与服务器断开连接有关。

    当您在编辑器环境中创建线程时,只要编辑器运行,线程将继续存在,即使您停止游戏。如果以多线程方式使用 TCP,则必须在某些 OnDestroy 或 OnDisable 方法中手动停止线程。

    同时确保在停止游戏时断开与服务器的连接。

    如果这些还不足以解决您的问题,那么如果您可以分享一些导致此问题的示例代码,我可能会提供帮助。

    【讨论】:

    • 只要您仔细处理我上面提到的 Unity 编辑器特定的事情,它应该可以工作。也许您的代码有错误或其他问题。您是否尝试构建和运行?
    • 我使用带有 AsyncCallback 的 socket.BeginConnect 来处理结果。即使在很长一段时间后,也从未调用过回调。即使我在没有运行本地服务器的情况下运行客户端,它也没有得到响应。从 MSDN 看,运行时会使用后台线程来处理请求,那么请求是否可能被运行时丢弃?
    【解决方案2】:

    根据这个http://answers.unity3d.com/questions/925955/socketbeginwrite-no-response-in-463f1.html?sort=oldest看来,在unity3d v4.6.3f1中,mono runtime在BeginXXX系列函数的实现上有一些bug。

    unity 团队可能会在较新的版本中修复这些错误(未测试),但我仍然需要继续使用 v4.6.3f1,因此解决方法是将 BeginXXX 替换为 XXXAsync 系列。 (经过测试并适用于我的问题)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-24
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2022-01-16
      • 2019-06-06
      相关资源
      最近更新 更多