在 android 的 unity3d 中可以使用 TcpClients 吗?
Is the usage of TcpClients in unity3d for android possible?
我正在尝试制作一个通过 Unity 5.4 与我的服务器通信的 andorid 应用程序。设备需要在同一个网络中才能这样做。
为此,我使用 System.Net.Sockets 和 TcpClient 连接到我的服务器。当我从编辑器中 运行 将其构建为 Windows standalone.The 托管服务的 pc 与 运行 独立的不同 pc 之间的通信时,一切正常是可能的并且按预期工作。一旦我将其构建为 .apk 并将其安装在我的 smartphone 上,我就会得到一个 SocketException。我的 phone 也卡住了很长一段时间
正在使用 TcpClient,是否可以在 android 上使用 unity3d?
我得到的异常是:
System.Net.Sockets.SocketException: Connection timed out
我确保两个设备都在同一个网络中,例如托管服务器的我的电脑的 IP 是 192.168.178.24,我的 smartphone 的 IP 是 192.168.178.113.
所需端口已打开,防火墙允许数据通过。
我在 Unity 中 运行nig 这段代码:
private TcpClient client;
private StreamWriter writer;
void Start()
{
try
{
client = new TcpClient(AddressFamily.InterNetwork);
IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
Debug.Log(ipAddress.ToString());
client.Connect(ipAddress, 11000);
writer = new StreamWriter(client.GetStream());
Debug.Log("connected");
}
catch (ArgumentNullException ane)
{
Debug.Log(string.Format("ArgumentNullException : {0}", ane.ToString()));
}
catch (SocketException se)
{
Debug.Log(string.Format("SocketException : {0}", se.ToString()));
}
catch (Exception e)
{
Debug.Log(string.Format("Unexpected exception : {0}", e.ToString()));
}
}
我仔细检查了从播放器首选项收到的 IP 地址是否正确。
有人知道是什么原因导致它甚至无法建立连接吗?我在我的电脑上试过 Wireshark,它没有显示任何传入的包,所以我的猜测是有时在建立连接时出错。
这是我的 smartphone 日志输出的图像:
LogCat Output
编辑:服务器代码
public class ServiceListener
{
public TcpListener Listener;
public void StartListening()
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = Array.Find<IPAddress>(ipHostInfo.AddressList, ipMatch => ipMatch.AddressFamily == AddressFamily.InterNetwork);
Listener = new TcpListener(ipAddress, 11000);
Listener.Start();
}
public void StopListening()
{
Listener.Stop();
}
}
static void Main()
{
ServiceListener currentListener = new ServiceListener();
currentListener.StartListening();
TcpClient currentClient = currentListener.Listener.AcceptTcpClient();
StreamReader reader = new StreamReader(currentClient.GetStream());
Console.WriteLine("Connected");
while (true)
{
byte[] messageBytes = new byte[1024];
if (!reader.EndOfStream)
{
string message = reader.ReadLine();
string[] messageParts = message.Split('|');
int xOffset = int.Parse(messageParts[0]);
int yOffset = int.Parse(messageParts[1]);
bool leftClick = bool.Parse(messageParts[2]);
bool rightClick = bool.Parse(messageParts[3]);
Console.WriteLine(string.Format("x:{0},y:{1},left:{2},right:{3}", xOffset, yOffset, leftClick, rightClick));
}
else
{
currentClient = currentListener.Listener.AcceptTcpClient();
reader = new StreamReader(currentClient.GetStream());
}
}
}
Is using a TcpClient, is that possible on android with unity3d ?
是的,是的。这是很有可能的,应该有效。
你的问题很可能来自这行代码:
IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
因为您的托管服务器 IP 是 192.168.178.24
。为测试目的对值进行硬编码以查看 PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey)
是否返回无效的 IP 地址。
可能是这样的:
IPAddress ipAddress = IPAddress.Parse("192.168.178.24");
服务器代码中要做的另一件事是将 Application.runInBackground = true;
放入 Start()
函数中。这将确保您的服务器 运行 正在运行,即使 Applciation 不在焦点上也是如此。
最后,您目前正在使用 synchronous
服务器套接字。连接时,从服务器接收数据,Unity 将 block/freeze 直到该操作完成。您应该在另一个 Thread
中使用 asynchronous
套接字或 运行 您的服务器和客户端代码。这看起来不像当前的问题,但您稍后会 运行 解决它。
我正在尝试制作一个通过 Unity 5.4 与我的服务器通信的 andorid 应用程序。设备需要在同一个网络中才能这样做。
为此,我使用 System.Net.Sockets 和 TcpClient 连接到我的服务器。当我从编辑器中 运行 将其构建为 Windows standalone.The 托管服务的 pc 与 运行 独立的不同 pc 之间的通信时,一切正常是可能的并且按预期工作。一旦我将其构建为 .apk 并将其安装在我的 smartphone 上,我就会得到一个 SocketException。我的 phone 也卡住了很长一段时间
正在使用 TcpClient,是否可以在 android 上使用 unity3d?
我得到的异常是:
System.Net.Sockets.SocketException: Connection timed out
我确保两个设备都在同一个网络中,例如托管服务器的我的电脑的 IP 是 192.168.178.24,我的 smartphone 的 IP 是 192.168.178.113.
所需端口已打开,防火墙允许数据通过。
我在 Unity 中 运行nig 这段代码:
private TcpClient client;
private StreamWriter writer;
void Start()
{
try
{
client = new TcpClient(AddressFamily.InterNetwork);
IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
Debug.Log(ipAddress.ToString());
client.Connect(ipAddress, 11000);
writer = new StreamWriter(client.GetStream());
Debug.Log("connected");
}
catch (ArgumentNullException ane)
{
Debug.Log(string.Format("ArgumentNullException : {0}", ane.ToString()));
}
catch (SocketException se)
{
Debug.Log(string.Format("SocketException : {0}", se.ToString()));
}
catch (Exception e)
{
Debug.Log(string.Format("Unexpected exception : {0}", e.ToString()));
}
}
我仔细检查了从播放器首选项收到的 IP 地址是否正确。
有人知道是什么原因导致它甚至无法建立连接吗?我在我的电脑上试过 Wireshark,它没有显示任何传入的包,所以我的猜测是有时在建立连接时出错。
这是我的 smartphone 日志输出的图像: LogCat Output
编辑:服务器代码
public class ServiceListener
{
public TcpListener Listener;
public void StartListening()
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = Array.Find<IPAddress>(ipHostInfo.AddressList, ipMatch => ipMatch.AddressFamily == AddressFamily.InterNetwork);
Listener = new TcpListener(ipAddress, 11000);
Listener.Start();
}
public void StopListening()
{
Listener.Stop();
}
}
static void Main()
{
ServiceListener currentListener = new ServiceListener();
currentListener.StartListening();
TcpClient currentClient = currentListener.Listener.AcceptTcpClient();
StreamReader reader = new StreamReader(currentClient.GetStream());
Console.WriteLine("Connected");
while (true)
{
byte[] messageBytes = new byte[1024];
if (!reader.EndOfStream)
{
string message = reader.ReadLine();
string[] messageParts = message.Split('|');
int xOffset = int.Parse(messageParts[0]);
int yOffset = int.Parse(messageParts[1]);
bool leftClick = bool.Parse(messageParts[2]);
bool rightClick = bool.Parse(messageParts[3]);
Console.WriteLine(string.Format("x:{0},y:{1},left:{2},right:{3}", xOffset, yOffset, leftClick, rightClick));
}
else
{
currentClient = currentListener.Listener.AcceptTcpClient();
reader = new StreamReader(currentClient.GetStream());
}
}
}
Is using a TcpClient, is that possible on android with unity3d ?
是的,是的。这是很有可能的,应该有效。
你的问题很可能来自这行代码:
IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
因为您的托管服务器 IP 是 192.168.178.24
。为测试目的对值进行硬编码以查看 PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey)
是否返回无效的 IP 地址。
可能是这样的:
IPAddress ipAddress = IPAddress.Parse("192.168.178.24");
服务器代码中要做的另一件事是将 Application.runInBackground = true;
放入 Start()
函数中。这将确保您的服务器 运行 正在运行,即使 Applciation 不在焦点上也是如此。
最后,您目前正在使用 synchronous
服务器套接字。连接时,从服务器接收数据,Unity 将 block/freeze 直到该操作完成。您应该在另一个 Thread
中使用 asynchronous
套接字或 运行 您的服务器和客户端代码。这看起来不像当前的问题,但您稍后会 运行 解决它。