对所有调用使用套接字的单个实例

时间:2015-11-26 02:55:43

标签: c# .net multithreading sockets callback

我正在尝试使用低级套接字在C#和java服务器中创建客户端服务器客户端应用程序: 该过程如下  他们点击登录或注册的充电客户界面 我打开我的套接字我将请求发送到我的服务器,我启动一个线程来不断读取服务器发送的数据:一切正常:  除了我必须保留我的套接字用于后续呼叫,我知道如何做:SOS 这是一段代码: /// t称为第一个呼叫服务器

    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
    }

1 个答案:

答案 0 :(得分:1)

查看单例模式https://msdn.microsoft.com/en-au/library/ff650316.aspx

从本质上讲,你的单身人士会包裹你的插座。您只需创建套接字的单个实例,并通过单例引用它。

如何管理何时打开和关闭套接字取决于您。