用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类型的数值,接收时读取该值就可以知道数据有多长了,如果没有收完所有数据,连接就中断了,就说明传输过程出错,出错如何重传是你的事了。