2014-04-22 3 views
0

J'ai implémenté un serveur, et j'essaie maintenant de le rendre multithread, mais j'ai rencontré un problème en raison de l'échec du serveur lors de la réception des données et du StreamWriter de lire les données du Stream.Serveur multi-thread

Le code est le suivant:

class whereisServer 
{ 
    static Socket connection; 
    static object threadLock = new object(); 

    static void Main(string[] args) 
    { 
     Thread t = new Thread(new ThreadStart(Run)); 
     t.Start(); 
    } 

    static void Run() 
    { 
     NetworkStream socketStream; 
     TcpListener listener; 
     const int PORT = 43; 
     try 
     { 
      listener = new TcpListener(IPAddress.Any, PORT); 
      listener.Start(); 
      while (true) 
      { 
       connection = listener.AcceptSocket(); 
       socketStream = new NetworkStream(connection); 
       try 
       { 
        connection.ReceiveTimeout = 1000; 
        connection.SendTimeout = 1000; 
        Thread t = new Thread(new ParameterizedThreadStart(DoRequest)); 
        t.Start(socketStream); 
        //DoRequest(socketStream); 
       } 
       catch (IOException e) 
       { 
        Console.WriteLine(e.Message + "\nTimeOut Handled"); 
       } 
       finally 
       { 
        socketStream.Close(); 
        connection.Close(); 
       } 
      } 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

    static void DoRequest(object stream) 
    { 
     NetworkStream socketStream = (NetworkStream)stream; 
     StreamWriter writer = new StreamWriter(socketStream); 
     StreamReader reader = new StreamReader(socketStream); 

     lock (threadLock) 
     { 
      //DO SERVER STUFF HERE 
     } 

Lorsque vous appelez la méthode DoRequest sans fils le programme fonctionne très bien, mais en commentant cela et appeler la version filetée c'est lorsque les problèmes surviennent.

Je serais reconnaissant si quelqu'un pourrait suggérer pourquoi le Stream est incapable de fonctionner.

+1

Il serait utile si vous nous avez donné votre message d'erreur .. nous ne pouvons que deviner quel est le problème autrement. –

+0

L'exception dit que le "stream n'a pas été inscriptible" De plus, il est dit que mes StreamWriter et StreamReader sont égaux à null bien que je les aie créés.Ce code fonctionne très bien quand je n'utilise pas le threading –

Répondre

1

Dans le cas du multithread, vous appelez les méthodes Close plus tôt que DoRequest.

C'est parce que ces deux lignes sont en fin de bloc.

socketStream.Close(); 
connection.Close(); 

Ces deux lignes sont exécutées immédiatement après la méthode Start démarre le nouveau thread, mais avant que le fil aura terminé ses travaux en DoRequest.

Je vous recommande d'appeler ces méthodes à l'intérieur DoRequest. Vous pouvez passer connection objet dans DoRequest, puis créer socketStream en interne dans DoRequest et lorsque vous avez terminé, fermez ces deux objets avant de terminer la méthode DoRequest. (Ou vous pouvez utiliser n'importe quelle autre solution, ce n'est qu'une option.)

+0

Merci, ça marche sauf que je ne peux passer qu'un seul paramètre via la méthode Start sur le Thread, dont je passe actuellement le NetworkStream.Comment recommanderiez-vous de fermer les connexions dans la méthode DoRequest Merci –

+0

Vous pouvez utiliser try-finally dans DoRequest. –

+0

OK merci, j'ai été capable de l'implémenter, mais depuis que j'ai commencé à utiliser la version threadée, ma méthode DoRequest a cessé de fonctionner correctement.Il est prévu de mettre à jour la position d'une personne quand elle est entrée par le client, mais pas Ma méthode DoRequest peut être trouvée ici: http://codeshare.io/ZQpgy –

Questions connexes