socket编程:Socket编程项目经验谈

        我们项目是用DotNet实现Socket连接用多线程处理多用户我就谈下在实现过程中遇到问题下面是我服务器简化实现
   private Socket clientSocket;
  public void Start
  {
  Thread thread= Thread( ThreadStart(MainService));
  thread.Start;
  }
  void MainService
  {
  listener= TcpListener(111111);
  listener.Start;
  while(true)
  {
  Socket s= listener.AcceptSocket;//帧听客户连接
  clientSocket=s;
  Thread clientservice =  Thread( ThreadStart(ClientService));
  clientservice.Start;
  Thread.Sleep(200);//1、等待传值给线程中变量防止多用户造成冲突
  }
  }
  void ClientService
  {
   command;
   receiveStr;
   fileName,fileSize;
  Socket sock=clientSocket;
  EndPo oldEP=sock.RemoteEndPo;
   bb= [200];
  while(true)
  {
  ii=sock.ReceiveFrom(bb,ref oldEP);//接收数据
  (ii0)//2、客户端连接断开就会不停接收0个字节
  {
  ;
  }
  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));//接受数据思路方法,
  ;
  ....................
  }
  }
  void uploadFile(Socket sock, fileName, fileSize)
  {
   loadSize=0;
   bb;
   blen=102400;
  NetworkStream stream= NetworkStream(sock);
  FileStream fs=File.OpenWrite(tempstr);
  while(loadSize  {
  (loadSize>fileSize-102400)
  blen=fileSize-loadSize;
  bb= [blen];
   ii=stream.Read(bb,0,bb.Length);//3、实际接受数据时每次可能没有10240个字节
  fs.Write(bb,0,ii);
  loadSizeii;
  }
  fs.Close;
  stream.Close;
  }



  1、等待传值给线程中变量防止多用户造成冲突

  2、客户端连接断开就会不停接收0个字节

  判断客户端是否断开要用这个思路方法实现Sokcet里带Connected不起作用只要连接上中途不出现发送和或接收数据客户断开和否都是返回truePoll(100,SelectMode...)返回任何模式都是true

  3、实际接受数据时每次可能没有10240个字节

  客户端我就不写了用TcpClient连接就可以了当然实际应用中可能就要自己写规则了

  这些问题解决了只要做适当处理视频声音都不是问题了

Tags:  socket编程原理 linuxsocket编程 javasocket编程 socket编程

延伸阅读

最新评论

发表评论