我试图第一次从套接字读取,然后中止处理它的线程,然后再次重新读取。奇怪的是,有时它起作用,有时却不起作用。
客户:
private void startSend()
{
Image f;
ms = new MemoryStream();
while (true)
{
f = GetDesktopImage();
f.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
bmpBytes = (ms.ToArray());
SendVarData(client.Client, bmpBytes);
count++;
ms.SetLength(0);
}
}
private int SendVarData(Socket s, byte[] data)
{
total = 0;
int size = data.Length;
int dataleft = size;
int sent;
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
我在始终保持在后台运行的线程中调用开始发送。
服务器代码:
MemoryStream ms;
byte[] data;
public void startListening()
{
while (true)
{
try
{
data = ReceiveVarData(client.Client);
ms = new MemoryStream(data);
theImage.Image = Image.FromStream(ms);
count++;
} catch {}
}
}
private static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, 0);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0) break;
total += recv;
dataleft -= recv;
}
return data;
}
就像我第一次说的那样,它很棒,但是比我尝试关闭第二个表单上的线程时要好
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
th.Abort();
}
并尝试再次阅读我在这行中得到一个错误
byte []数据=新的byte [size];
错误:
算术运算导致溢出
试图打印size
价值,这就像-2522561418
...
当然,我在窗体打开时再次重新启动线程
th= new Thread(new ThreadStart(startListening));
th.Start();
您不能从已读取的套接字中“重读”数据。您为什么认为这是可能的?我不了解其背后的思路。
Thread.Abort是邪恶的,无法使用。只要您的代码包含对该方法的调用,您的代码就是无效的,必须进行更改。
Abort
反正不能中止IO。中止可能发生在网络读取之前或之后。我猜想这解释了为什么有时“重新读取”有效的原因-因为以前没有读取过数据。
可能在连接期间您应该有一个正在运行的线程。该线程应读取所有输入内容,并将其放入数据结构中,以供以后检索。例如,一个Queue<Image>
。
实际上,我强烈建议您删除所有这些套接字代码,并使用WCF或HTTP。这些协议为您处理了许多细节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句