利用TCP服務器接收多客戶端的音頻數據,通過Naudio進行播放及音頻處理(一)TCP服務器

建立tcp服務器

1.開啓服務

// 創建負責監聽的套接字,注意其中的參數;
            Socket Listensocket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 獲得文本框中的IP對象;
            IPAddress address = IPAddress.Parse("127.0.0.1");
            // 創建包含ip和端口號的網絡節點對象;
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse("8000"));
            // 將負責監聽的套接字綁定到唯一的ip和端口上;
            Listensocket.Bind(endPoint);
            // 設置監聽隊列的長度;
            Listensocket.Listen(200);

            // 創建負責監聽的線程;
            Thread threadWatch = new Thread(ListenConnecting);
            //是否爲後臺線程
            Thread threadWatch.IsBackground = true;
            //線程開始
            Thread threadWatch.Start();

2.監聽線程


/// <summary>
        /// 存放申請連接的客戶端
        /// </summary>
        public static Socket[] Clientsocket = new Socket[200];

public static void ListenConnecting()
        {
        	// 持續不斷的監聽客戶端的連接請求;
			while (true)  
           {
           		//請求的連接,爲阻塞的模式,無請求一直阻塞線程
            	Socket sokConnection = Listensocket.Accept();
            	//存入數組
            	for(int i=0;i<Clientsocket.length;i++){
            		if(Clientsocket[i]==null){
            			Clientsocket[i]=sokConnection;
            			break;
					}
            	}
            	//建立接收數據的線程
            	 Thread thread = new Thread(RecMsg);
                 thread.IsBackground = true;
                 //傳入Socket對象
                 thread.Start(sokConnection);
           }
        }

3.接收數據線程

/// <summary>
        /// 接收數據
        /// </summary>
        /// <param name="sokConnectionparn"></param>
 		public static void RecMsg(object sokConnectionparn)
        {
        //實例化Socket對象
        	Socket sokClient = sokConnectionparn;
        	//定義接收數組
        	byte[] arrMsgRec = new byte[128];
        	while (true)
            {
            	 try
                 {
                 	//接收客戶端數據	
                     int lengths = sokClient.Receive(arrMsgRec);
                 }
                 catch (SocketException ex)
                 {
                    //一方斷開連接
                    break;
                 }
                 if(lengths>0){
                 	//做數據處理
                 }                        \
                 else { 
                   //沒有任何數據
                 }
            }
        }

4.發送數據

/// <summary>
        /// 發送指令
        /// </summary>
        /// <param name="strMsg"></param>
        /// <param name="socket"></param>
        /// <returns></returns>
        public static bool SendData(string strMsg, Socket socket)
        {
        	// 將要發送的字符串轉換成Utf-8字節數組;
            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); 
            try
            {
                socket.Send(arrMsg);
                return true;
            }
            catch (Exception see)
            {
                return false;
            }
        }

5.關閉TCP服務

/// <summary>
        /// 關閉TCP服務
        /// </summary>
        /// <param name="sokClient"></param>
        public static void CloseTCPserver(Socket sokClient)
        {
            sokClient.Shutdown(SocketShutdown.Both);
            sokClient.Close();
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章