zoukankan      html  css  js  c++  java
  • 文件接收网络对讲机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

    文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
      答:因为李艳红这种败类,所以我没女友!

  • 相关阅读:
    8张图带你轻松温习 Java 知识.md
    关于 Java 序列化你不知道的 5 件事
    为什么 String 是不可变的?
    如何使用 Nginx 优雅地限流?
    JAVA泛型编程笔记
    java_接口的应用
    java_抽象类应用
    深入理解Java的接口和抽象类
    java_重写与重载的区别
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3050673.html
Copyright © 2011-2022 走看看