2013-12-05 3 views
0

В настоящее время я пытаюсь написать приложение TCP/TCP. Я чувствую, что я сделал плохую работу, так как я довольно новичок в этом с точки зрения C# (из Java).Серверная программа не будет читать из Stream

Мой клиент этот код:

public static void SendPlejeFamilieObjekt(PlejeFamilie pfamilie) 
    { 
     try 
     { 
      InitConnection(); 
      if (_isConnected) 
      { 
       _sWriter.WriteLine("SEND_PLEJEFAMILIE"); 

       if (_sReader.ReadLine().Equals("AUTH_GIVEN")) 
       { 
        #region Send Plejefamilie Objekt 
        _sWriter.WriteLine(pfamilie.CPRKvinde); 
        _sWriter.WriteLine(pfamilie.CPRMand); 
        _sWriter.WriteLine(pfamilie.NavnKvinde); 
        _sWriter.WriteLine(pfamilie.NavnMand); 
        _sWriter.WriteLine(pfamilie.Addresse); 
        _sWriter.WriteLine(pfamilie.MobilKvinde); 
        _sWriter.WriteLine(pfamilie.MobilMand); 
        _sWriter.WriteLine(pfamilie.HjemmeTelefon); 
        _sWriter.WriteLine(pfamilie.StillingKvinde); 
        _sWriter.WriteLine(pfamilie.StillingMand); 
        _sWriter.WriteLine(pfamilie.EmailKvinde); 
        _sWriter.WriteLine(pfamilie.EmailMand); 
        _sWriter.WriteLine(pfamilie.EmailFaelles); 
        _sWriter.WriteLine(pfamilie.GodkendtDato.ToShortDateString()); 
        _sWriter.WriteLine(pfamilie.PlejeForaeldreUdd); 
        _sWriter.WriteLine(pfamilie.AntalKurserIAar); 
        _sWriter.WriteLine(pfamilie.AntalBoernGodkendt); 
        _sWriter.WriteLine(pfamilie.Vilkaar); 
        _sWriter.WriteLine(pfamilie.Status); 
        #endregion Send Plejefamilie Objekt 
       } 
      } 
     } 
     finally 
     { 
      EndConnection(); 
     } 
    } 

И это работает весь путь вплоть до отправки «SEND_PLEJEFAMILIE». Я проверил это, выполнив печать на консоль.

Теперь в моем коде сервера выглядит следующим образом:

private static void HandleClient(object obj) 
    { 
     TcpClient client = (TcpClient)obj; 
     Console.WriteLine("Handling client: {0}", client.Client.LocalEndPoint.ToString()); 
     StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.ASCII); 
     StreamReader sReader = new StreamReader(client.GetStream(), Encoding.ASCII); 
     Console.WriteLine("Streams Acquired"); 
     bool bClientConnected = client.Connected; 
     Console.WriteLine("bClientConnected {0}", bClientConnected.ToString()); 
     String sData = sReader.ReadLine(); 
     List<String> list; 
     List<Note> nList; 
     List<Note> nList2; 
     while (bClientConnected) 
     { 
      Console.WriteLine(sData); 
      switch (sData) 
      { 
       #region Modtag Plejefamilie 
       case "SEND_PLEJEFAMILIE": 
        Console.WriteLine("Receiving PlejeFamilie"); 
        sWriter.WriteLine("AUTH_GIVEN"); 
        sWriter.Flush(); 
        Console.WriteLine("AUTH_GIVEN"); 
        list = new List<String>(); 
        while (!(sData = sReader.ReadLine()).Equals("END")) 
        { 
         list.Add(sData); 
        } 
        ServerPlejeFamilie spf = new ServerPlejeFamilie(); 
        spf.Info = list; 
        pfStack.Push(spf); 
        Console.WriteLine("Received {0}", spf.Info[0]); 
        break; 

Программа прекращает работу после этой строки кода: Console.WriteLine("bClientConnected {0}", bClientConnected.ToString());

Я не могу понять, почему. Ниже весь код для обоих классов только в случае, если вам это нужно:

код клиента:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Smart_Journal.Familie; 
using System.Net.Sockets; 
using System.IO; 
using System.Net; 

namespace Smart_Journal 
{ 
    /// <summary> 
    /// DBM is our Database Manager. This will handle sending and receiving of data from the server. 
    /// You should NOT call these functions directly. Instead, call the functions in the Utility class. 
    /// </summary> 
    public static class DBM 
    { 
     private static TcpClient _client; 
     private static StreamReader _sReader; 
     private static StreamWriter _sWriter; 
     private static bool _isConnected; 
     private static int portNum = 8888; 
     private static String ipAddress = "127.0.0.1"; 

     private static void InitConnection() 
     { 
      _client = new TcpClient(); 
      _client.Connect(ipAddress, portNum); 

      _sReader = new StreamReader(_client.GetStream(), Encoding.ASCII); 
      _sWriter = new StreamWriter(_client.GetStream(), Encoding.ASCII); 

      _isConnected = true; 
     } 

     private static void EndConnection() 
     { 
      _sWriter.WriteLine("END"); 

      _sReader.Close(); 
      _sWriter.Close(); 
      _client.Close(); 
      _isConnected = false; 
     } 

     public static void SendPlejeFamilieObjekt(PlejeFamilie pfamilie) 
     { 
      try 
      { 
       InitConnection(); 
       if (_isConnected) 
       { 
        _sWriter.WriteLine("SEND_PLEJEFAMILIE"); 

        if (_sReader.ReadLine().Equals("AUTH_GIVEN")) 
        { 
         #region Send Plejefamilie Objekt 
         _sWriter.WriteLine(pfamilie.CPRKvinde); 
         _sWriter.WriteLine(pfamilie.CPRMand); 
         _sWriter.WriteLine(pfamilie.NavnKvinde); 
         _sWriter.WriteLine(pfamilie.NavnMand); 
         _sWriter.WriteLine(pfamilie.Addresse); 
         _sWriter.WriteLine(pfamilie.MobilKvinde); 
         _sWriter.WriteLine(pfamilie.MobilMand); 
         _sWriter.WriteLine(pfamilie.HjemmeTelefon); 
         _sWriter.WriteLine(pfamilie.StillingKvinde); 
         _sWriter.WriteLine(pfamilie.StillingMand); 
         _sWriter.WriteLine(pfamilie.EmailKvinde); 
         _sWriter.WriteLine(pfamilie.EmailMand); 
         _sWriter.WriteLine(pfamilie.EmailFaelles); 
         _sWriter.WriteLine(pfamilie.GodkendtDato.ToShortDateString()); 
         _sWriter.WriteLine(pfamilie.PlejeForaeldreUdd); 
         _sWriter.WriteLine(pfamilie.AntalKurserIAar); 
         _sWriter.WriteLine(pfamilie.AntalBoernGodkendt); 
         _sWriter.WriteLine(pfamilie.Vilkaar); 
         _sWriter.WriteLine(pfamilie.Status); 
         #endregion Send Plejefamilie Objekt 
        } 
       } 
      } 
      finally 
      { 
       EndConnection(); 
      } 
     } 

     public static void SendPlejeBarnObjekt(PlejeBarn pbarn) 
     { 
      try 
      { 
       InitConnection(); 
       if (_isConnected) 
       { 
        _sWriter.WriteLine("SEND_PLEJEBARN"); 

        if (_sReader.ReadLine().Equals("AUTH_GIVEN")) 
        { 
         #region Send Plejebarn Objekt 
         _sWriter.WriteLine(pbarn.CPR); 
         _sWriter.WriteLine(pbarn.Navn); 
         _sWriter.WriteLine(pbarn.FolkeregisterAdresse); 
         _sWriter.WriteLine(pbarn.Email); 
         _sWriter.WriteLine(pbarn.Telefon); 
         _sWriter.WriteLine(pbarn.Sagsbehandler); 
         _sWriter.WriteLine(pbarn.Konsulent); 
         _sWriter.WriteLine(pbarn.Aflastning); 
         _sWriter.WriteLine(pbarn.NuvaerendeForanstaltning); 
         _sWriter.WriteLine(pbarn.AnbringelsesDato.ToShortDateString()); 
         _sWriter.WriteLine(pbarn.UdskrivningsDato.ToShortDateString()); 
         _sWriter.WriteLine("PLEJEBARN_B"); 

         foreach (Note n in pbarn.Bemaerkninger) 
         { 
          _sWriter.WriteLine(n.Dato.ToShortDateString()); 
          _sWriter.WriteLine(n.Navn); 
          _sWriter.WriteLine(n.Tekst); 
         } 
         _sWriter.WriteLine("END_PLEJEBARN_B"); 
         _sWriter.WriteLine("PLEJEBARN_TF"); 

         foreach (Note n in pbarn.TideligereForanstaltninger) 
         { 
          _sWriter.WriteLine(n.Dato); 
          _sWriter.WriteLine(n.Navn); 
          _sWriter.WriteLine(n.Tekst); 
         } 
         _sWriter.WriteLine("END_PLEJEBARN_TF"); 
         #endregion Send Plejebarn Objekt 
        } 
       } 
      } 
      finally 
      { 
       EndConnection(); 
      } 
     } 

     public static void SendBiologiskFamilieObjekt(BiologiskFamilie bfamilie) 
     { 
      try 
      { 
       InitConnection(); 
       if (_isConnected) 
       { 
        _sWriter.WriteLine("SEND_BIOLOGISKFAMILIE"); 

        if (_sReader.ReadLine().Equals("AUTH_GIVEN")) 
        { 
         #region Send Biologiskfamilie Objekt 
         _sWriter.WriteLine(bfamilie.CPRMor); 
         _sWriter.WriteLine(bfamilie.CPRFar); 
         _sWriter.WriteLine(bfamilie.NavnMor); 
         _sWriter.WriteLine(bfamilie.NavnFar); 
         _sWriter.WriteLine(bfamilie.Addresse); 
         _sWriter.WriteLine(bfamilie.MobilMor); 
         _sWriter.WriteLine(bfamilie.MobilFar); 
         _sWriter.WriteLine(bfamilie.HjemmeTelefon); 
         _sWriter.WriteLine(bfamilie.EmailMor); 
         _sWriter.WriteLine(bfamilie.EmailFar); 
         _sWriter.WriteLine(bfamilie.EmailFaelles); 
         _sWriter.WriteLine(bfamilie.ForaeldreMyndighed); 
         #endregion Send Biologiskfamilie Objekt 
        } 
       } 
      } 
      finally 
      { 
       EndConnection(); 
      } 
     } 

     public static PlejeFamilie HentPlejeFamilieObjekt(String s) 
     { 
      return null; 
     } 

     public static PlejeBarn HentPlejeBarnObjekt(String s) 
     { 
      return null; 
     } 

     public static BiologiskFamilie HentBiologiskFamilie(String s) 
     { 
      return null; 
     } 
    } 
} 

код сервера:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace Smart_Journal_Server 
{ 
    class Program 
    { 
     private static TcpListener _server; 
     private static bool _isRunning; 
     private static int port; 
     private static Stack<ServerPlejeFamilie> pfStack = new Stack<ServerPlejeFamilie>(); 
     private static Stack<ServerPlejeBarn> pbStack = new Stack<ServerPlejeBarn>(); 
     private static Stack<ServerBiologiskFamilie> bfStack = new Stack<ServerBiologiskFamilie>(); 
     private static Stack<Request> rStack = new Stack<Request>(); 

     static void Main(string[] args) 
     { 
      args = new string[1]; 
      args[0] = "8888"; 
      if (args.Length == 0) 
      { 
       return; 
      } 
      else 
      { 
       port = Convert.ToInt32(args[0]); 
      } 
      Console.WriteLine("Booting up Server with port number {0}...", port); 
      _server = new TcpListener(IPAddress.Any, port); 
      Console.WriteLine("IP Address Assigned: {0}", IPAddress.Parse(((IPEndPoint)_server.LocalEndpoint).Address.ToString())); 
      _server.Start(); 
      Console.WriteLine("Server Successfully Started"); 

      _isRunning = true; 

      Thread t = new Thread(new ParameterizedThreadStart(SendToDataBase)); 
      Thread t1 = new Thread(new ParameterizedThreadStart(RetrieveFromDataBase)); 
      t.Start(); 
      Console.WriteLine("Ready to write data to the Database"); 
      t1.Start(); 
      Console.WriteLine("Ready to read data from the Database"); 
      LoopClients(); 
     } 

     private static void SendToDataBase(object obj) 
     { 
      while (_isRunning) 
      { 
       if (pfStack.Count > 0) 
       { 
        ServerPlejeFamilie pfobj = pfStack.Pop(); 
        Console.WriteLine("Popping PlejeFamilieObject: {0}", pfobj.Info[0] + "," + pfobj.Info[1]); 
       } 

       if (pbStack.Count > 0) 
       { 
        ServerPlejeBarn pbobj = pbStack.Pop(); 
        Console.WriteLine("Popping PlejeBarnObject: {0}", pbobj.Info[0]); 
       } 

       if (bfStack.Count > 0) 
       { 
        ServerBiologiskFamilie bfobj = bfStack.Pop(); 
        Console.WriteLine("Popping BiologiskFamilieObject: {0}", bfobj.Info[0] + "," + bfobj.Info[1]); 
       } 
      } 
     } 

     private static void RetrieveFromDataBase(object obj) 
     { 
      while (_isRunning) 
      { 

      } 
     } 

     private static void LoopClients() 
     { 
      while (_isRunning) 
      { 
       //wait for client connection 
       TcpClient newClient = _server.AcceptTcpClient(); 

       Thread t = new Thread(new ParameterizedThreadStart(HandleClient)); 
       t.Start(newClient); 
      } 
     } 

     private static void HandleClient(object obj) 
     { 
      TcpClient client = (TcpClient)obj; 
      Console.WriteLine("Handling client: {0}", client.Client.LocalEndPoint.ToString()); 
      StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.ASCII); 
      StreamReader sReader = new StreamReader(client.GetStream(), Encoding.ASCII); 
      Console.WriteLine("Streams Acquired"); 
      bool bClientConnected = client.Connected; 
      Console.WriteLine("bClientConnected {0}", bClientConnected.ToString()); 
      String sData = sReader.ReadLine(); 
      List<String> list; 
      List<Note> nList; 
      List<Note> nList2; 
      while (bClientConnected) 
      { 
       Console.WriteLine(sData); 
       switch (sData) 
       { 
        #region Modtag Plejefamilie 
        case "SEND_PLEJEFAMILIE": 
         Console.WriteLine("Receiving PlejeFamilie"); 
         sWriter.WriteLine("AUTH_GIVEN"); 
         sWriter.Flush(); 
         Console.WriteLine("AUTH_GIVEN"); 
         list = new List<String>(); 
         while (!(sData = sReader.ReadLine()).Equals("END")) 
         { 
          list.Add(sData); 
         } 
         ServerPlejeFamilie spf = new ServerPlejeFamilie(); 
         spf.Info = list; 
         pfStack.Push(spf); 
         Console.WriteLine("Received {0}", spf.Info[0]); 
         break; 
        #endregion Modtag Plejefamilie 
        #region Modtag Plejebarn 
        case "SEND_PLEJEBARN": 
         sWriter.WriteLine("AUTH_GIVEN"); 
         sWriter.Flush(); 
         list = new List<String>(); 
         nList = new List<Note>(); 
         nList2 = new List<Note>(); 
         while (!(sData = sReader.ReadLine()).Equals("END")) 
         { 
          if (sData.Equals("PLEJEBARN_B")) 
          { 
           do 
           { 
            Note n = new Note(); 
            n.Dato = Convert.ToDateTime(sReader.ReadLine()); 
            n.Navn = sReader.ReadLine(); 
            n.Tekst = sReader.ReadLine(); 
            nList.Add(n); 

            sData = sReader.ReadLine(); 
           } while (!sData.Equals("END_PLEJEBARN_B")); 
          } 
          else if (sData.Equals("PLEJEBARN_TF")) 
          { 
           do 
           { 
            Note n = new Note(); 
            n.Dato = Convert.ToDateTime(sReader.ReadLine()); 
            n.Navn = sReader.ReadLine(); 
            n.Tekst = sReader.ReadLine(); 
            nList2.Add(n); 
            sData = sReader.ReadLine(); 
           } while (!sData.Equals("END_PLEJEBARN_TF")); 
          } 
          else 
          { 
           list.Add(sData); 
          } 
         } 
         ServerPlejeBarn spb = new ServerPlejeBarn(); 
         spb.Info = list; 
         spb.Bemaerkninger = nList; 
         spb.TideligereForanstaltninger = nList2; 
         pbStack.Push(spb); 
         Console.WriteLine("Received {0}", spb.Info[0]); 
         break; 
        #endregion Modtag Plejebarn 
        #region Modtag Biologisk Familie 
        case "SEND_BIOLOGISKFAMILIE": 
         sWriter.WriteLine("AUTH_GIVEN"); 
         sWriter.Flush(); 
         list = new List<String>(); 
         while (!(sData = sReader.ReadLine()).Equals("END")) 
         { 
          list.Add(sData); 
         } 
         ServerBiologiskFamilie sbf = new ServerBiologiskFamilie(); 
         sbf.Info = list; 
         bfStack.Push(sbf); 
         Console.WriteLine("Received {0}", sbf.Info[0]); 
         break; 
        #endregion Modtag Biologisk Familie 
        default: 
         sWriter.WriteLine("NO_AUTH"); 
         break; 
       } 
      } 
      sWriter.Close(); 
      sReader.Close(); 
      client.Close(); 
     } 
    } 
} 
+0

Действительно? Никого нет? Это первый xD – OmniOwl

+0

Почему вы не используете службы WCF (или другую технологию webservice)? – RononDex

+0

Меня не преподают в этом, поэтому я пошел с более традиционным подходом TCP/IP. Это для экзамена и реальной компании, которая должна будет использовать это в какой-то момент. – OmniOwl

ответ

0

Попробуйте добавить _sWriter.Flush(); после _sWriter.WriteLine ("SEND_PLEJEFAMILIE"); в клиентском коде.

+0

другой вариант должен включать AutoFlush – Tar

+0

Не похоже, что @neith хочет иметь репутацию своего ответа, так как он дал это вам. Но вы также дали правильный ответ, и право должно быть правильным, чтобы вы получили репутацию :) – OmniOwl

+0

О, комментарий с его ответом был под строкой, я этого не заметил.Не хотел красть его славу, я решил, что мой ответ будет самостоятельно :) Но все равно сделано. По крайней мере, я добавил «AutoFlush» в качестве опции;) – Tar

Смежные вопросы