熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2022-06-13   來源: Java核心技術 

  我們的項目是用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)
  blen=fileSizeloadSize;
  bb=new byte[blen];
  int ii=streamRead(bbbbLength);//實際接受數據時每次可能沒有個字節
  fsWrite(bbii);
  loadSize+=ii;
  }
  fsClose();
  streamClose();
  }

  等待傳值給線程中的變量防止多用戶造成沖突

  客戶端連接斷開就會不停接收個字節

  判斷客戶端是否斷開要用這個方法實現Sokcet裡帶的Connected不起作用只要連接上中途不出現發送和或接收數據錯誤客戶斷開與否都是返回truePoll(SelectMode)返回任何模式都是true

  實際接受數據時每次可能沒有個字節

  客戶端我就不寫了用TcpClient連接就可以了當然實際應用中可能就要自己寫規則了

  這些問題解決了只要做適當的處理視頻聲音都不是問題了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26331.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.