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

來源:互聯網
上載者:User

我們的項目是用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串連就可以了,當然實際應用中,可能就要自己寫規則了
  
  這些問題解決了,只要做適當的處理,視頻,聲音都不是問題了。;

來源http://www.meifuq.tk

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.