0

Unity 5.4를 통해 내 서버와 통신하는 andorid 앱을 만들려고합니다. 장치는 동일한 네트워크에 있어야 이렇게 할 수 있습니다.안드로이드 용 unity3d의 TcpClients 사용이 가능합니까?

그 때문에 System.Net.Sockets 및 TcpClient를 사용하여 내 서버에 연결합니다. 모든 것이 잘 편집기에서 실행하거나 독립 실행 형 Windows를 실행하면 독립 실행 형 PC를 실행하는 PC와 다른 컴퓨터 사이의 통신이 가능합니다. 내가 .apk로 빌드하고 스마트 폰에 설치하자마자 SocketException이 발생합니다. 또한 휴대 전화가 꽤 오랫동안로드되지 않습니다.

TcpClient를 사용하고 있으며, unity3d가있는 android에서 가능합니까?

내가 얻는 예외는 다음과 같습니다

System.Net.Sockets.SocketException: Connection timed out 

내가 두 장치가 동일한 네트워크, 예를 들어,에 있는지 확인했다 서버를 호스팅하는 PC의 IP는 192.168.178.24이고 스마트 폰의 IP는 192.168.178.113입니다.

필요한 포트는 열려 있고 방화벽은 데이터를 통과시킵니다.

나는 유니티에서이 코드를 runnig 오전 : 플레이어의 환경 설정에서 받았습니다 IP 주소가 맞다면 내가 확인을 두 번

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())); 
    } 
} 

, 그것은이다.

누군가가 연결을 설정하지 못하게하는 원인이 있습니까? 내 PC에서 Wireshark를 시도했는데 들어오는 패키지가 표시되지 않았으므로 연결을 설정하는 중 실수가 될 수 있습니다. 서버 코드

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()); 
      } 
     } 
    } 
+0

방금 ​​기억했습니다. 아직 해결 되었습니까? – Programmer

+0

그것은 지금 wokring하고있다. 그러나 나는 정확하게 이유를 모른다. 그리고 나는 같은 문제를 가진 사람들을위한 해결책을 제시하고자합니다. 길에있을 때 여유 시간을 가졌으므로 노트북 컴퓨터로 시도해 보았습니다. 새 프로젝트에서 내 서버 코드를 복사하고 붙여 넣었습니다. 어떻게 든 내 서버는 안드로이드를 받아들이지 못했지만, 복사 한 후 새 프로젝트에 붙여 넣는 것과 동일한 코드를 100 % 사용했습니다. – Kusakari13

+0

나는 그것을 시험해 보았습니다. 방화벽 문제 일 가능성이 큽니다. 다른 스레드로 구현하거나 비동기 메서드를 사용할 수 있습니다. 해피 코딩! – Programmer

답변

0

하여 TcpClient를 사용 unity3d와 안드로이드에 가능성이있다 : LogCat Output

편집 : 여기

스마트 폰에서 내 로그 출력을위한 이미지입니다?

예, 그렇습니다. 그것은 매우 가능하며 효과가 있어야합니다.

귀하의 문제는 코드 줄에서 올 가능성이 높다 : 호스팅 서버 IP 이후

IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey)); 

192.168.178.24입니다. PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey)이 잘못된 IP 주소를 반환하는지 확인하기 위해 테스트 용 값을 하드 코드합니다.

아마 뭔가 같은 :

IPAddress ipAddress = IPAddress.Parse("192.168.178.24"); 

서버 코드에서 할 수있는 또 다른 것은 당신의 Start() 기능에 Application.runInBackground = true;를 넣어하는 것입니다. 이렇게하면 Applciation에 초점이 맞지 않아도 서버가 실행 중인지 확인할 수 있습니다.

마지막으로 현재 서버 소켓은 synchronous입니다. 서버에 연결하여 데이터를 수신하면 Unity는 해당 작업이 완료 될 때까지 차단/고정합니다.asynchronous 소켓을 사용하거나 서버 및 클라이언트 코드를 Thread으로 실행해야합니다. 이것은 현재의 문제처럼 보이지 않지만 나중에 문제가 발생할 것입니다.

+0

감사합니다! 전에 하드 코딩 된 IP를 시도했지만, 독립형 PC 및 편집기에서 작동했지만 모바일에서는 작동하지 않았습니다. 그게 나를 가장 혼란스럽게하는 일, 독립 실행 형 PC 및 편집기,하지만 모바일에 대한 모든 작동합니다. 내 서버가 통합되어 실행되고 있지 않습니다. 현재 콘솔 응용 프로그램이며 나중에 Windows 서비스가됩니다. 감사합니다. 현재 실행중인 버전을 관리 할 때 비동기 통신을 시도합니다. – Kusakari13

+0

하드 코딩 된 부분을 시도했지만 작동하지 않는 경우 다른 네트워크에서이 방법을 시도해보십시오. 두 장치를 다른 라우터에 연결하고 테스트하십시오. 동시에, 질문에 서버 코드를 게시해야합니다. – Programmer

+0

나는 cosole 응용 프로그램에 대한 서버 코드를 추가했습니다. 또한 나는 2 개의 분리 된 네트워크에서 그것을 시도했다 – Kusakari13

관련 문제