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

用socket接收数据,如何判断结束或别的解决方法?
public Form1()
  {
  InitializeComponent();
  Thread thread = new Thread(new ThreadStart(Listen));
  thread.Start();
  }
   
  protected void Listen()
  {
  socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  socket.Bind(new IPEndPoint(IPAddress.Any, 2000));
  socket.Listen(0);
  while (true)
  {
  acceptSocket = socket.Accept();
  Thread thread = new Thread(new ThreadStart(BeginTempSocket));
  thread.Start();
  }

  //socket.BeginAccept(new AsyncCallback(AsyncAcceptSocket), socket);  
  }
   
  protected void BeginTempSocket()
  {
  try
  {
  while (true)
  {
  //使用socket的send/receive方法来发送/读取数据
  byte[] receBytes = new byte[1024];
  acceptSocket.Receive(receBytes, receBytes.Length, 0);
  string content = Encoding.BigEndianUnicode.GetString(receBytes);
  rtbxContent.Invoke(new MethodInvoker(delegate
  {
  //rtbxContent.Text = "";
  rtbxContent.AppendText(content);
  }));
  }  
  }
  catch (Exception ex)
  {
   
  MessageBox.Show("出错了: \n" + ex.Message, "错误");
  }  
  }
用socket接收数据,代码如上;实际效果是在接收完的末尾光标一直在闪动;界面无法操作;
原因是:while(true)来接收数据,传送的数据接收完以后,还是不断接收空数据,填充接收数组的都是0;


请教:这个地方该如何处理,谢谢!


------解决方案--------------------
数据发送端发送完后把socket关掉。然后你的接收端循环体内部
acceptSocket.Receive(receBytes, receBytes.Length, 0);此函数返回0就代表断开了。跳出循环。
测试的时候发送端和接收端不要在一台机器上。那样测不出来的。

------解决方案--------------------
是否结束,你总要有个协议吧,比如先告诉你要发多少数据,然后你接收完就是了,或者给你一个结束标志,否则的话,谁知道完没完,除非连接断开
------解决方案--------------------
再响应的内容开头,给一个8字节长度的位置存放一个long类型的数值,接收时读取该值就可以知道数据有多长了,如果没有收完所有数据,连接就中断了,就说明传输过程出错,出错如何重传是你的事了。