日期:2014-05-18  浏览次数:21020 次

有关stocket通讯,服务端如何持续接收客户端命令并返回数据给客户端问题
我现在做一个stocket程序,客户端和服务端连接成功后,客户端做数据增删查改,每次给服务端发送一条sql语句,服务端就接收到后进行数据库处理返回给客户端一个压缩后的Dataset,现在的问题是服务端现在这能接收到一次客户端命令,请各位给我点意见如何进行持续的接收,在不用到线程的情况下。现在我贴出服务端的代码:
int port = 50000;
  string host = "192.168.1.145";

  //创建终结点
  IPAddress ip = IPAddress.Parse(host);//
  IPEndPoint ipe = new IPEndPoint(ip,port);

  //创建监听socket
  Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  s.Bind(ipe);
  s.Listen(0);
  MesServer.AppendText("等待客户端连接...\n");
  //s.Connect(ipe);
   

  //为接受客户端连接,建立新的socket
  Socket client = s.Accept();
  MesServer.AppendText("已与客户端建立连接\n");

  //接受从客户端发送的消息
  string reClient = "";
  byte[] recvBytes = new byte[1024];
  int bytes;
  bytes = client.Receive(recvBytes, recvBytes.Length, 0);
  reClient += Encoding.ASCII.GetString(recvBytes, 0, bytes);
   
  MesServer.AppendText("get client message:" + reClient + "\n");

  //根据发送过来的SQL语句返回数据流给客户端
  DataSet ds = ToClientDS(reClient);

  //压缩数据集,并发送到客户端
  byte[] b = ObjectZip.CompressDataSet(ds);
  client.Send(b, b.Length, 0);

  //接收服务端返回的数据集
  DataSet Clientds = new DataSet();
  byte[] recvBytes = new byte[1024];
  int bytes;
  bytes = c.Receive(recvBytes, recvBytes.Length, 0);//接收服务端的数据流,并存入缓冲区
  //Stream stream = new MemoryStream(recvBytes);
  Clientds = ObjectZip.DecompressDataSet(recvBytes);
  dataGridView1.DataSource = Clientds.Tables[0];
  c.close();
  }
  catch (Exception ex)
  {
  MesClient.AppendText("Exception:" + ex.Message + "\n");
  }

   
  }

------解决方案--------------------
持续的接收就是无限循环,或者用信号量
------解决方案--------------------
WHILE(TRUE)
{
Socket client = s.Accept();
。。。。
}