2011-11-12 1 views
1

J'écris un simple serveur Tcp dans Unity et mon application Flash s'y connecte. J'ai trouvé un excellent tutoriel sur le serveur Tcp en ligne, et mon application flash s'y connecte très bien. Cependant, je ne suis pas en mesure d'envoyer des données en dehors du fil d'écoute au client connecté. J'ai essayé de créer une référence globale du Tcpclient obtenu à l'intérieur du thread. Cependant, cette référence (sclient) ne fonctionne qu'à l'intérieur du thread d'écoute, imprimée Null à la console en dehors du thread. Il doit y avoir quelque chose que je peux faire pour conserver la référence du client TCP pour une utilisation ultérieure ou y accéder depuis l'extérieur du thread de bloc. S'il vous plaît aider!Ponçage des données d'un serveur C# TCP vers un client connecté en dehors du fil d'écoute

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

public class TCPServer: MonoBehaviour 
{ 
    private TcpListener tcpListener; 
    private Thread listenThread; 
    private TcpClient sclient; 

    public float fireRate = 0.5F; 
    private float nextFire = 0.0F; 

public TCPServer() 
{ 
    IPAddress localAddress = IPAddress.Parse("127.0.0.1"); 
    this.tcpListener = new TcpListener(localAddress, 9001); 
    this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
    this.listenThread.Start(); 
} 

public void ListenForClients() 
{ 
    this.tcpListener.Start(); 

    while (true) 
{ 
    //blocks until a client has connected to the server 
    sclient = this.tcpListener.AcceptTcpClient(); 

    print(sclient);//print "System.Net.Sockets.TcpClient" in console 

    this.sMessage("Can you hear me now?");//this one works fine 
}  
} 

public void sMessage(String m){ 
    print(cStream); //print "Null" to console 
    NetworkStream clientStream = sclient.GetStream(); 
    ASCIIEncoding encoder = new ASCIIEncoding(); 
    byte[] buffer = encoder.GetBytes(m); 

    print("Received Connection from " + tcpClient.Client.RemoteEndPoint); 
    print("Sending message.."); 
    print(clientStream.CanWrite);//returns true in console 

    clientStream.Write(buffer, 0 , buffer.Length); 
    clientStream.WriteByte (0); 
    clientStream.Flush(); 
} 

void Update() { 
    if (Input.GetButton("Fire1") && Time.time > nextFire) { 
     nextFire = Time.time + fireRate; 
     this.sMessage("BOOM BOOM");//this one won't work. keep saying sclient is null 
    } 
} 

Répondre

0

En général, il est besit si vous évitez les méthodes synchrones de prise, NetworkStream, vous devez utiliser xxxxAsync (socket a de telles méthodes) ou des méthodes BeginXXX. Cela vous donne des performances élevées avec le nombre de clients connectés. Ok maintenant à propos de synchornous ... vous devriez créer un nouveau thread pour chaque nouveau client connecté et commencer le traitement de session sur ce thread. Je vous suggère de faire une classe de session pour le client connecté, et tout le traitement dans cette classe.

public class Your_Session 
{ 
    private TcpClient m_pClient = null; 

    public Your_Session(TcpClient client) 
    { 
     mpClient = client; // Assign client to mpClient 
    } 

    internal void Start(Object state) 
    { 
     // NOTE: call this Start method: 
     // ThreadPool.QueueUserWorkItem(new WaitCallback(session.Start)); 


     // Start your session processing here. This method is called from threapool thread. 
    } 
} 

appel suffit de créer la session instance de classe (Your_Session session = new YourSession ...) dans la méthode de ListenForClients et appeler ThreadPool.QueueUserWorkItem (nouveau WaitCallback (session.Start)); pour démarrer le traitement de la session.

+0

Salut Ivar Merci pour votre solution, je vais essayer, j'ai 0 expérience dans la programmation de thread/session. Avant d'entrer dans une seconde, une fois que je commence la session, comment envoyer des données au client? par exemple, j'ai une valeur externe qui est constamment mise à jour et envoyée au client, comment puis-je faire cela dans cette session? – Ghettokon

+0

Je ne comprends pas exactement ce que vous voulez dire ... – Ivar

0

Où est la méthode qui appelle Update?

Il semble qu'aucun client n'ait encore été connecté lorsque vous l'invoquez.