http://www.aygfsteel.com/ebecket 返還網
          隨筆-140  評論-11  文章-131  trackbacks-0
          我們的項目是用DotNet實現Socket連接,用多線程處理多用戶。我就談一下在實現過程中遇到的問題。下面是我服務器的簡化實現。
            private Socket clientSocket;
            
            public void Start()
            {
            Thread thread=new Thread(new ThreadStart(MainService));
            thread.Start();
            }
            void MainService()
            {
            listener=new TcpListener(111111);
            listener.Start();
            while(true)
            {
            Socket s= listener.AcceptSocket();//幀聽客戶連接
            clientSocket=s;
            Thread clientservice = new Thread(new ThreadStart(ClientService));
            clientservice.Start();
            Thread.Sleep(200);//1、等待傳值給線程中的變量,防止多用戶造成沖突
            }
            }
            
            void ClientService()
            {
            string command;
            string receiveStr;
            string fileName,fileSize;
            Socket sock=clientSocket;
            EndPoint oldEP=sock.RemoteEndPoint;
            byte[] bb=new byte[200];
            while(true)
            {
            ii=sock.ReceiveFrom(bb,ref oldEP);//接收數據
            if(ii==0)//2、客戶端連接斷開,就會不停接收0個字節
            {
            break;
            }
            receiveStr=Encoding.Default.GetString(bb,0,bb.Length);
            command=ReadLineFrom(receiveStr,1).ToLower();//ReadLineFrom讀取字符串中的一行數據
            Switch(command)
            {
            cace “upload“:
            fileName=ReadLineFrom(receiveStr,2);
            fileSize=ReadLineFrom(receiveStr,3);
            uploadFile(sock,fileName,Int32.Parse(fileSize));//接受數據方法,
            break;
            ....................
            }
            
            }
            
            void uploadFile(Socket sock,string fileName,int fileSize)
            {
            int loadSize=0;
            byte[] bb;
            int blen=102400;
            NetworkStream stream=new NetworkStream(sock);
            FileStream fs=File.OpenWrite(tempstr);
            while(loadSize   {
            if(loadSize>fileSize-102400)
            blen=fileSize-loadSize;
            bb=new byte[blen];
            int ii=stream.Read(bb,0,bb.Length);//3、實際接受數據時每次可能沒有10240個字節
            fs.Write(bb,0,ii);
            loadSize+=ii;
            }
            fs.Close();
            stream.Close();
            }
            
            1、等待傳值給線程中的變量,防止多用戶造成沖突
            
            2、客戶端連接斷開,就會不停接收0個字節
            判斷客戶端是否斷開要用這個方法實現,Sokcet里帶的Connected不起作用,只要連接上,中途不出現發送和或接收數據錯誤,客戶斷開與否都是返回true。Poll(100,SelectMode...)返回任何模式都是true。
            
            3、實際接受數據時每次可能沒有10240個字節
            
            客戶端我就不寫了,用TcpClient連接就可以了,當然實際應用中,可能就要自己寫規則了
            
            這些問題解決了,只要做適當的處理,視頻,聲音都不是問題了。
          posted on 2010-01-25 20:47 becket_zheng 閱讀(195) 評論(0)  編輯  收藏 所屬分類: C#
          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆分類(138)

          隨筆檔案(134)

          文章分類(77)

          文章檔案(109)

          email

          常去的Blog

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 禹州市| 年辖:市辖区| 双桥区| 来宾市| 枣庄市| 常山县| 江城| 临邑县| 府谷县| 辽中县| 寿宁县| 东至县| 乐山市| 连州市| 尖扎县| 孟村| 温宿县| 轮台县| 黔西县| 保山市| 和田县| 高州市| 武宁县| 蓬莱市| 门源| 卓尼县| 象州县| 罗城| 峡江县| 合阳县| 龙游县| 涟源市| 财经| 宿松县| 永春县| 台中县| 任丘市| 高要市| 贵州省| 慈溪市| 广德县|