2015-11-26 5 views
0

пытаюсь создать клиентское приложение клиентского сервера на C# и java-сервере с помощью низкоуровневого сокета: Процесс выглядит следующим образом: Зарядный интерфейс клиента, который они нажимают «Вход» или зарегистрировать Я открываю мой сокет. Я отправляю запрос на свой сервер, и я запускаю поток для постоянного чтения данных, отправленных сервером: все это хорошо работает: , за исключением того, что я должен сохранить свой сокет для последующих вызовов, и я знаю, как сделать это: SOS Вот фрагмент кода: /// т называется сервером Первый вызовиспользовать один экземпляр сокета для всех вызовов

public void Inscritpionidentification(string Commande,string UserID,string Password, string Nom,string prenom,string Email) 
     { 
      IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2007); 
      ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      try 
      { 
       ClientSocket.Connect(ipEnd); 
       if(ClientSocket.Connected) 
        { 
         //SendMsg(GetSequence()+NickName);     
         //Connect.Enabled=false; 
       if (Commande.Equals("/Identification")) 
      { 
      SendMsg("Identification");   

      } 
      if (Commande.Equals("/Account/Create")) 
      { 
       SendMsg("Inscription")); 
      } 

        } 



      } 
      catch (SocketException E) 
      { 
       MsgBox("Connection" + E.Message); 

      } 


      try 
      { 
       DataReceived = new Thread(new ThreadStart(CheckData)); // Read constantly gives the server sent 
       DataReceived.Start(); 
      } 
      catch (Exception E) 
      { 
       MsgBox("Démarrage Thread" + E.Message); 
         } 

      while (UTF8Content==null) { 

      } 
      // Traitement 


     } 

    void SendMsg(string message) 
    { 

     byte[] msg = System.Text.Encoding.UTF8.GetBytes(message); 
     int DtSent = ClientSocket.Send(msg, msg.Length, SocketFlags.None); 
     if (DtSent == 0) 
     { 
      MsgBox("aucune donnèe n'as ete envoyé"); 

     } 
    } 

//// My thread 
private void CheckData() 
     { 
      try 
      { 
       while(true) 
       { 

        if(ClientSocket.Connected) 
        { 
         if(ClientSocket.Poll(10,SelectMode.SelectRead) && ClientSocket.Available==0) 
         { 
          //La connexion a été clôturée par le serveur ou bien un problème 
          //réseau est apparu 
          MsgBox("La connexion au serveur est interrompue.Reessayez!!"); 

          Thread.CurrentThread.Abort(); 
         } 
        //Si la socket a des données à lire       
         if(ClientSocket.Available>0) 
         { 
           string messageReceived=null;                 
           while(ClientSocket.Available>0) 
           { 
             try 
             {     

              byte[] msg=new Byte[ClientSocket.Available]; 
              //Réception des données 
              ClientSocket.Receive(msg,0,ClientSocket.Available,SocketFlags.None); 
              messageReceived=System.Text.Encoding.UTF8.GetString(msg).Trim();            
              //On concatène les données reçues(max 4ko) dans une variable de la classe 
              UTF8Content+=messageReceived; 


             } 
             catch(SocketException E) 
             { 

             } 

           } 


         } 
        } 
        //On temporise pendant 10 millisecondes, ceci pour éviter 
        //que le micro processeur s'emballe 
        Thread.Sleep(10); 
       } 

      } 
      catch 
      {     
       //Ce thread étant susceptible d'être arrêté à tout moment 
       //on catch l'exception afin de ne pas afficher un message à l'utilisateur 
       Thread.ResetAbort(); 
      }     
     } 

// Я вызываю эту функцию после того, как зарегистрировался ..par против этой проблемы, я должен использовать тот же сокет, который я создаю в функции IdentificationInscription, которая, по-видимому, невозможна, даже если поток является toujour DataRecevied в исполнении ... любая помощь будет оценена спасибо

public void ModifCompte(string UserID, string Password, string Nom, string prenom, string Email) { 

     SendMsg("Update"); // *Error Socket has null* 
     while (UTF8Content == null) 
     { 


     } 
     //My treatment 
    } 
+0

большое спасибо, что это решение, наконец, dieal –

ответ

1

Посмотрите на одноплодной шаблон https://msdn.microsoft.com/en-au/library/ff650316.aspx.

В сущности, ваш синглтон обернет ваш сокет. Вы создали бы только один экземпляр сокета и ссылаетесь на него через singleton.

Как вам управлять, когда открывать и закрывать розетку зависит от вас.

+0

Здравствуйте, Благодарим за отзыв, К минусам моя проблема в том, что во время моего следующего вызова на сервер я нахожу свой сокет = null, что нормально, потому что для каждого вызова инициализируется вся наша переменная сервера. –

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