天天看點

檔案接收網絡對講機C#伺服器 Android用戶端(二) C#伺服器代碼分析

最近研究檔案接收,稍微總結一下,以後繼承補充:

    整完的工程下載下傳址地(源碼)

    :http://download.csdn.net/detail/zhujinghao09/5313666 

    序程功能紹介:

                      伺服器: PC

                           言語   C#

                           按鈕開啟serverSocket

private void btnStartServer_Click(object sender, EventArgs e)
        {
            string strip = tbIP.Text;                  //手動填寫IP址地
            string strport = tbPort.Text;              //端口号   
            IPAddress IP;
             int Port;
             try
             {

                 if (strip != "" && strport != "")
                 {
                     IP = IPAddress.Parse(strip);
                     Port = Convert.ToInt32(strport);
                     this.lIP.Text = IP.ToString();
                     this.lport.Text = strport;
                 }
                 else                               //如果沒有填寫任何資訊,則認默是當位址地和1234端口号      
                 {
                     IP = GetIP();                  //取得當地IP址地   
                     Port = 1234;
                     this.lIP.Text = IP.ToString();
                     this.lport.Text = Port.ToString();
                 }
                 if (IP != null)
                     serverFullAddr = new IPEndPoint(IP, Port);
                 else
                 {
                     MessageBox.Show("沒有到得确正IP址地!!");
                     return;
                 }
                 server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);              
                 server.Bind(serverFullAddr);
                 lbserverState.Text = "伺服器已啟動!!";
             }
             catch(Exception el)
             {
                 MessageBox.Show(el.Message);
                 return;
             }
            //開啟帶有參數的聽監線程,并把伺服器socket傳遞給線程     
            ParameterizedThreadStart parstart = new ParameterizedThreadStart(ConnectListen);
            Thread thListen = new Thread(parstart);
            threadList.Add(thListen);
            thListen.Start((object)server);
        }      

    取得 當地IP址地            此段代碼直接從網上找到的

public IPAddress GetIP()
        {
           // string strAddr = "";
            IPAddress IP=null;
            try
            {
                string strHostName = System.Net.Dns.GetHostName();
                System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
                foreach (IPAddress _ipaddress in ipEntry.AddressList)
                {
                    if (_ipaddress.AddressFamily.ToString().ToLower() == "internetwork")
                    {
                        //strAddr = _ipaddress.ToString();
                        IP = _ipaddress;
                        break;
                    }
                }

              //  Log.Debug("  IP:" + strAddr);
            }
            catch (System.Exception e)
            {
                //Log.Error("  Get IP Address Error:" + e.Message);
                MessageBox.Show("沒有取得主機的IP!!!");
            }

            return IP;
        }      

    聽監用戶端接連線程

private void ConnectListen(object server)
        {
            Socket serverSocket = (Socket)server;
            while (true)                          //環循接聽接連
            {
                serverSocket.Listen(20);
                Socket acceptSock = serverSocket.Accept();
                byte[] byteArray = new byte[50];
                acceptSock.Receive(byteArray);//接收資料                             //接收用戶端發送來過的使用者名 認默50個位元組,處置到得字元串
                //将位元組數組轉成字元串
                string strRec = System.Text.Encoding.Default.GetString(byteArray);     //C# byte[] 轉換為  string 
                string socketName = strRec.Substring(0, strRec.IndexOf("\n"));
                IPAddress clientIp = ((System.Net.IPEndPoint)acceptSock.RemoteEndPoint).Address;      取得用戶端IP址地
                string strip = clientIp.ToString();
                socketNameList.Add(socketName);
                socketIpList.Add(strip);
                UpdatePersonListBox();                      //更新使用者清單
                clientSocketList.Add(acceptSock);
                ParameterizedThreadStart parstart = new ParameterizedThreadStart(RecvFile);              為每一個用戶端添加接收資訊聽監線程
                Thread th = new Thread(parstart);
                threadList.Add(th);
                th.Start((object)acceptSock);
            }
        }      

  接收檔案線程

    每日一道理

喜歡海,不管湛藍或是光燦,不管平靜或是波濤洶湧,那起伏蕩漾的,那絲絲的波動;喜歡聽海的音聲,不管是浪擊礁石,或是浪濤翻滾,那輕柔的,那澎湃的;喜歡看海,不管心情是舒暢的或是沉悶的,不管天氣是晴朗的或是陰沉的,那舒心的,那松弛的……

private void RecvFile(object acceptSock)
        {
            bool flag = false;
            Socket recvSocket = (Socket)acceptSock;
            byte[] byteArry = new byte[256];

            string path = "recvVoice";          //建創接收檔案檔案夾
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string strnow = DateTime.Now.ToString("yyyyMMdd-hh-mm-ss");               //根據統系時光定名接收檔案
            string strpath = "recvVoice\\" + strnow + ".wav";
      
            byte[] buffLen = new byte[50];
            int count=recvSocket.Receive(buffLen);                                  //接收檔案的位元組長度用于斷判接收檔案結束   認默50位元組發送
            string strRec = System.Text.Encoding.Default.GetString(buffLen);
            string fLen = strRec.Substring(0, strRec.IndexOf("\n"));
            int fileLen = 0;
            try
            {
                fileLen = Convert.ToInt32(fLen);
            }
            catch(Exception el)
            {
                MessageBox.Show(el.Message);
            }
            int recCount = 0;
            int readLen = 0;
            MemoryStream memStream = new MemoryStream();
            try
            {
                while ((recCount = recvSocket.Receive(byteArry)) > 0)                // 環循接收檔案  位元組發送
                {
                    readLen = readLen + recCount;
                    if (readLen >= fileLen)                                     //跳出環循志标     
                    {
                        memStream.Write(byteArry, 0, recCount);
                        flag = true;
                        break;
                    }
                    memStream.Write(byteArry, 0, recCount);                        //把網絡流寫進檔案流     
                    flag = true;                                                  //接收檔案志标
                }
            }
            catch (Exception el)
            {
                flag = false;
                memStream.Close();
             //   fs.Close();
                memStream = null;
              //  fs = null;
                MessageBox.Show(el.Message);
                RecvFile(acceptSock);                                //應用遞歸  繼承聽監檔案接收來信
                return;
            }
            if (flag)
            {
                FileStream fs = new FileStream(strpath, FileMode.OpenOrCreate);
                memStream.WriteTo(fs);
                fs.Close();
                fs = null; 
                UpdateLabel(flag);
                IPAddress clientIp = ((System.Net.IPEndPoint)recvSocket.RemoteEndPoint).Address;
                string strip = clientIp.ToString();
                int index = socketIpList.IndexOf(strip);
                AddVoiceToListBox(socketNameList[index] + "****" + socketIpList[index], strpath, flag);              //把用戶端使用者名址地,接收檔案的存保徑路
                                                                                                                     //添加到音聲清單       
 }
            flag = false;
            memStream.Close();
            memStream = null;
            RecvFile(acceptSock);                                   //應用遞歸  繼承聽監檔案接收來信                                  
        }      

    當地音聲發送數函

private void SendFile(Socket acceptSock,string vpath)
        {
            Socket sendSocket = (Socket)acceptSock;
            byte[] byteArray = new byte[100];
            Stream st = File.OpenRead(vpath);
            Byte[] b = new Byte[1024];

            string strlen = st.Length.ToString();
            byte[] bytes = System.Text.Encoding.Default.GetBytes(strlen + "\r\n");          //string 轉換byte[]   
            sendSocket.Send(bytes);             //發送檔案長度     用于斷判檔案接收結束



            int count = 0;
            int sent = 0;
            int offset = 0;
            int left = 0;
            Thread.Sleep(1000);           //重點哦
            while (offset < st.Length)
            {
                //buffer.CopyTo(b, 1024);
                count = st.Read(b, 0, 1024);
                offset = offset + count;
                left = Convert.ToInt32(st.Length) - offset;
                if (left <= 1024)
                {
                    byte[] temp = new byte[left];
                    sent = sendSocket.Send(b);
                    // Thread.Sleep(10);
                    count = st.Read(b, 0, left);
                    sent = sendSocket.Send(temp);
                    break;
                }
                sent = sendSocket.Send(b);

            }
            IPAddress clientIp = ((System.Net.IPEndPoint)sendSocket.RemoteEndPoint).Address;
            string strip = clientIp.ToString();
            int index = socketIpList.IndexOf(strip);
            AddVoiceToListBox("Server Send To ****" + socketNameList[index], vpath, true);
        }      

    整完的工程下載下傳址地(源碼)

    :http://download.csdn.net/detail/zhujinghao09/5313666

文章結束給大家分享下程式員的一些笑話語錄:

問:你覺得讓你女朋友(或者任何一個女的)從你和李彥宏之間選一個,你覺得她會選誰?  

  答:因為李豔紅這種敗類,是以我沒女友!

檔案接收網絡對講機C#伺服器 Android用戶端(二) C#伺服器代碼分析