熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

關於Socket編程項目之後經驗談

2013-11-13 09:41:31  來源: .NET編程 

  我們的項目是用DotNet實現Socket連接用多線程處理多用戶我就談一下在實現過程中遇到的問題下面是我服務器的簡化實現
  private Socket clientSocket;
  
  public void Start()
  {
  Thread thread=new Thread(new ThreadStart(MainService));
  threadStart();
  }
  void MainService()
  {
  listener=new TcpListener();
  listenerStart();
  while(true)
  {
  Socket s= listenerAcceptSocket();//幀聽客戶連接
  clientSocket=s;
  Thread clientservice = new Thread(new ThreadStart(ClientService));
  clientserviceStart();
  ThreadSleep();//等待傳值給線程中的變量防止多用戶造成沖突
  }
  }
  
  void ClientService()
  {
  string command;
  string receiveStr;
  string fileNamefileSize;
  Socket sock=clientSocket;
  EndPoint oldEP=sockRemoteEndPoint;
  byte[] bb=new byte[];
  while(true)
  {
  ii=sockReceiveFrom(bbref oldEP);//接收數據
  if(ii==)//客戶端連接斷開就會不停接收個字節
  {
  break;
  }
  receiveStr=EncodingDefaultGetString(bbbbLength);
  command=ReadLineFrom(receiveStr)ToLower();//ReadLineFrom讀取字符串中的一行數據
  Switch(command)
  {
  cace upload:
  fileName=ReadLineFrom(receiveStr);
  fileSize=ReadLineFrom(receiveStr);
  uploadFile(sockfileNameIntParse(fileSize));//接受數據方法
  break;
  
  }
  
  }
  
  void uploadFile(Socket sockstring fileNameint fileSize)
  {
  int loadSize=;
  byte[] bb;
  int blen=;
  NetworkStream stream=new NetworkStream(sock);
  FileStream fs=FileOpenWrite(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。tW.WiNGWIT.ComPoll(100,SelectMode...)返回任何模式都是true。
  
  3、實際接受數據時每次可能沒有10240個字節
  
  客戶端我就不寫了,用TcpClient連接就可以了,當然實際應用中,可能就要自己寫規則了
  
  這些問題解決了,只要做適當的處理,視頻,聲音都不是問題了。
From:http://tw.wingwit.com/Article/program/net/201311/11345.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.