connecter un programme a Unity via Network

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
nafasso
Messages : 23
Inscription : 15 Oct 2014 08:36

connecter un programme a Unity via Network

Message par nafasso » 19 Août 2015 08:06

Salut a tous,

alors je vous expose mon probleme/questionnement:

je dois connecter 2 programmes l'un a l'autre et je voudrais savoir comment le faire via un server localhost.

Grossierement j'ai un programme Unity et un autre programme random. Ce deuxieme programme est sense envoyer un message via le port 9999 et je souhaiterai tout d'abord lancer ce programme via Unity et ensuite lire son message. Je pense que Network est ce qu'il faut utiliser mais c'est ma premiere utilisation de cette classe alors j'ai quelques doutes sur la facon de faire, pourriez vous eclairer ma lanterne ?

pour le moment j'ai cree un NetworkManager qui est sense creer le server et ouvrir le programme externe mais je ne suis meme pas sur de ma facon d'initialiser le server.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class NetworkManager : MonoBehaviour
{
	private const string typeName = "UniqueGameName";
	private const string gameName = "RoomName";

	private void StartServer()
	{
		Network.InitializeServer(2, 9999, Network.HavePublicAddress());
		MasterServer.RegisterHost(typeName, gameName);
		MasterServer.ipAddress = "127.0.0.1";
	}

	void OnServerInitialized()
	{
		Debug.Log("Server Initialized");
		System.Diagnostics.Process.Start (path + "MotionRecognizer.exe");
	}


	// Use this for initialization
	void Start ()
	{
		StartServer();
	}
//	
//	// Update is called once per frame
//	void Update () {
//	
//	}
}
pourriez vous m'aider a y voir un peu plus clair et me guider dans ma demarche s'il vous plait ?

Merci d'avance.
Cordialement.

EDIT : j'ai rajoute la ligne qui lance le programme mais et lorsque j'execute, le programme externe se lance puis affiche un message comme quoi il a arrete de fonctionner ... alors que lorsque je le lance en dehors de Unity tout marche tres bien. Auriez vous des pistes sur la raison de ce probleme ?

Avatar de l’utilisateur
nafasso
Messages : 23
Inscription : 15 Oct 2014 08:36

Re: connecter un programme a Unity via Network

Message par nafasso » 20 Août 2015 02:11

personne ne peux me dire comment faire pour ecouter un port dans Unity ?
creer un thread avec un listener ou un truc du genre ?

Avatar de l’utilisateur
nafasso
Messages : 23
Inscription : 15 Oct 2014 08:36

Re: connecter un programme a Unity via Network

Message par nafasso » 20 Août 2015 09:44

Bon voila j'ai trouve un script permettant de faire ce que je desirai.
Merci pour l'enorme aide que j'ai recu ...
Je poste tout de meme le script au cas ou ca puisse aider quelqu'un dans le futur et que les gens soient tout aussi motive pour l'aider :

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Collections.Generic;
using System.Text;


public class Server : MonoBehaviour
{
	Socket SeverSocket = null;
	Thread Socket_Thread = null;
	bool Socket_Thread_Flag = false;

	//for received message
//	private float mouse_delta_x;
//	private float mouse_delta_y;
//	private bool isTapped;
//	private bool isDoubleTapped;
//
//	public float getMouseDeltaX(){return mouse_delta_x;	}
//	public float getMouseDeltaY(){return mouse_delta_y;	}
//	public bool getTapped(){return isTapped;}
//	public bool getDoubleTapped(){return isDoubleTapped;}
//
//	public void setMouseDeltaX(float dx){mouse_delta_x = dx;}
//	public void setMouseDeltaY(float dy){mouse_delta_y = dy;}
//	public void setTapped(bool t){isTapped = t;}
//	public void setDoubleTapped(bool t){isDoubleTapped = t;}
//
//	private int tick =0;
	//private string[] receivedMSG;
	//public string[] getMsg(){return receivedMSG;	}


	string[] stringSeparators = new string[] {"*TOUCHEND*","*MOUSEDELTA*","*Tapped*","*DoubleTapped*"};

	void Awake()
	{
		Socket_Thread = new Thread(Dowrk);
		Socket_Thread_Flag = true;
		Socket_Thread.Start();
	}
	
	private void Dowrk()
	{
		//receivedMSG = new string[10];
		SeverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
		IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
		SeverSocket.Bind(ipep);
		SeverSocket.Listen(10);
		
		Debug.Log("Socket Standby....");
		Socket client = SeverSocket.Accept();//client에서 수신을 요청하면 접속합니다.
		Debug.Log("Socket Connected.");
		
		IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
		NetworkStream recvStm = new NetworkStream(client);
		//tick = 0;
				
		while (Socket_Thread_Flag)
		{
			byte[] receiveBuffer = new byte[1024 * 80];
			try
			{
					
				//print (recvStm.Read(receiveBuffer, 0, receiveBuffer.Length));
				if(recvStm.Read(receiveBuffer, 0, receiveBuffer.Length) == 0 ){
					// when disconnected , wait for new connection.
					client.Close();
					SeverSocket.Close();
					
					SeverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
					ipep = new IPEndPoint(IPAddress.Any, 10000);
					SeverSocket.Bind(ipep);
					SeverSocket.Listen(10);
					Debug.Log("Socket Standby....");
					client = SeverSocket.Accept();//client에서 수신을 요청하면 접속합니다.
					Debug.Log("Socket Connected.");
					
					clientep = (IPEndPoint)client.RemoteEndPoint;
					recvStm = new NetworkStream(client);
					
				}else{
								

					string Test = Encoding.Default.GetString(receiveBuffer);
					//string Test = Convert.ToBase64String(receiveBuffer);
					//Test = Test.Normalize();


					print (Test);
					//string[] splitMsg = Test.Split(stringSeparators,System.StringSplitOptions.RemoveEmptyEntries);
					// parsing gogo

//					string[] splitMsg = Test.Split('*');
////					print (splitMsg);
//					if(splitMsg.Length>1)
//					{
//						if(splitMsg[1].CompareTo("Tapped")==0){
//							print ("tap");
//							isTapped = true;
//						}else if(splitMsg[1].CompareTo("DoubleTapped")==0){
//							print ("double tap");
//							isDoubleTapped = true;
//						}else if(splitMsg[1].CompareTo("MOUSEDELTA")==0){
//							print ("move");
//							//string[] lastMsg = splitMsg[splitMsg.Length-1].Split('*');
//							mouse_delta_x = (float)Convert.ToDouble(splitMsg[2]);
//							mouse_delta_y = (float)Convert.ToDouble(splitMsg[3]);
//						}else{
//							print ("Fuck :"+splitMsg[1].Length);
//							
//						}
//					}
//
//					string singletap = "one";
//					string doubletap = "two";
//					if(splitMsg.Length>0){
//
//

//							
//						if(lastMsg.Length>1){
//						

//
//						}else{
//
//							print ("split msg : "+splitMsg[0]);
//							int tmp = (int)Convert.ToInt32(splitMsg[0]);
//							if(tmp ==1){
//
//								print ("Tapped!~");
//							
//								isTapped = true;
//
//							}else if(tmp ==2){
//
//								print ("Double Tapped!~");
//							
//								isDoubleTapped = true;
//							
//							}else{				
//
//							}
//						}
//					}else{
//
//					}

					//print (receivedMSG);

				}
				
				
			}
			
			catch (Exception e)
			{
				Socket_Thread_Flag = false;
				client.Close();
				SeverSocket.Close();
				continue;
			}
			
		}
		
	}
	
	void OnApplicationQuit()
	{
		try
		{
			Socket_Thread_Flag = false;
			Socket_Thread.Abort();
			SeverSocket.Close();
			Debug.Log("Bye~~");
		}
		
		catch
		{
			Debug.Log("Error when finished...");
		}
	}
	
	
}



Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: connecter un programme a Unity via Network

Message par boubouk50 » 20 Août 2015 09:51

C'est la période des vacances, tout le monde ne fait pas du réseau et tout le monde n'est pas connecté H24 sur le forum. Donc merci de montrer un peu de patience, tu as posté ta question seulement hier matin, ça fait tout juste 24h...
Excuser ton impatience en blâmant les autres de leur manque de réactivité ne leur donnera pas plus envie de te répondre par la suite. On est pas un SAV d'Unity.
Et au final, tu as trouvé toi même la réponse en 24h, comme quoi t'étais pas si bloqué.
Merci de garder un minimum de courtoisie.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
nafasso
Messages : 23
Inscription : 15 Oct 2014 08:36

Re: connecter un programme a Unity via Network

Message par nafasso » 20 Août 2015 10:12

Je n'ai insulte personne ni blame, j'ai simplement fait preuve d'un peu de sarcasme.
Apres je reconnais que je suis a l'autre bout du monde et que du coup je suis un peu decale du coup je perds un peu la notion du temps en france.
J'etais bel et bien bloque et si je n'avais pas eu un collegue coreen pour m'aider a trouver un script sur un site coreen, j'avoue que je serai sans doute a l'heure actuelle encore bloque.
Bref tout ca pour dire que j'ai trouve une solution et que du coup j'ai poste le code.

Verrouillé

Revenir vers « (C#) CSharp »