一直从事c++方面的开发,进来需要使用c#做项目,项目中需要解析一段网络流,从中将图片提取出来,网络协议很简单,采用
<image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}><image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}>.......传输,
写了个简单类,吧jpeg数据提取处理,直接上代码
public delegate void onImageDataHandle(int id1, int id2, int id3, int id4, byte[] buffer);
public class ImageRecive
{
static public void onImageDataDefault(int id1, int id2, int id3, int id4, byte[] buffer)
{
return;
}
public onImageDataHandle onImageHandle = onImageDataDefault;
public ImageRecive(string addr,int port)
{
_addr = addr;
_port = port;
}
public void addPictrueBox(int iKey, ref System.Windows.Forms.PictureBox pictrueBox)
{
_mapPictrueBox.Add(iKey, pictrueBox);
}
public void Start()
{
_thread = new Thread(new ThreadStart(this.doWork));
_thread.IsBackground = true;
_thread.Start();
}
public void Stop()
{
_thread.Abort();
_thread.Join();
}
private string readStr2Int(ref MemoryStream ms)
{
byte[] buffer = new byte[10];
int j = 0;
for (int i = 0; i < 10;i++ )
{
byte be = (byte)ms.ReadByte();
if (be.CompareTo((byte)' ') == 0)
{
continue;
}
if (be.CompareTo((byte)',') != 0)
{
buffer[j++] = be;
}
else
{
break;
}
}
string str = System.Text.Encoding.ASCII.GetString(buffer);
str.Trim('\0');
return str;
}
private void readMemBuffer(ref MemoryStream ms, byte[] buffer, int iSize)
{
for (int i = 0; i < iSize;i++ )
{
ms.Read(buffer, i, 1);
}
return;
}
private void receiveToBuffer(ref Socket s, byte[] buffer, int iSize)
{
int offset = 0;
while (offset < iSize)
{
int len = s.Receive(buffer, offset, iSize - offset, SocketFlags.None);
offset += len;
}
return;
}
private void doWork()
{
Socket sockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
int debug_index = 0;
sockClient.ReceiveBufferSize = 0x0FFFFFFF;
sockClient.Connect(_addr, _port);
MemoryStream msStream = new MemoryStream();
int bufferSize = 100;
byte[] buffer = new byte[bufferSize];
int cID1 = 0, cID2 = 0, cID3 = 0, cID4 = 0;
byte[] imageStr = new byte[6];
while (!_bStop)
{
if (msStream.Length - msStream.Position < 6)
{
//int len = sockClient.Receive(buffer);
receiveToBuffer(ref sockClient, buffer, bufferSize);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(buffer, 0, bufferSize);
msStream.Seek(pos, SeekOrigin.Begin);
}
long rLen = msStream.Read(imageStr, 0, 6);
if (imageStr[0].CompareTo((byte)'<') == 0 &&
imageStr[1].CompareTo((byte)'i') == 0 &&
imageStr[2].CompareTo((byte)'m') == 0 &&
imageStr[3].CompareTo((byte)'a') == 0 &&
imageStr[4].CompareTo((byte)'g') == 0 &&
imageStr[5].CompareTo((byte)'e') == 0)
{
if (msStream.Length - msStream.Position < 50)
{
//int len = sockClient.Receive(buffer);
receiveToBuffer(ref sockClient, buffer, bufferSize);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(buffer, 0, bufferSize);
msStream.Seek(pos, SeekOrigin.Begin);
}
//image id
msStream.ReadByte();
msStream.ReadByte();
int iImageID = Int32.Parse(readStr2Int(ref msStream));
cID1 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID2 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID3 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
cID4 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier);
int iImageSize = Int32.Parse(readStr2Int(ref msStream)); //
msStream.ReadByte();
msStream.ReadByte();
Int64 imagePosStart = msStream.Position;
//怀疑图像长度可能不准确时,可以通过jpeg图片结束标记0xFF 0xD9 判断图像结束
//while (true)
//{
// if (msStream.Length-msStream.Position < 10)
// {
// receiveToBuffer(ref sockClient, buffer, bufferSize);
// Int64 pos = msStream.Position;
// msStream.Seek(0, SeekOrigin.End);
// msStream.Write(buffer, 0, bufferSize);
// msStream.Seek(pos, SeekOrigin.Begin);
// }
// byte[] endBuffer = new byte[3];
// readMemBuffer(ref msStream, endBuffer, 3);
// //if (msStream.Position == 0x99C0)
// //{
// // int debug = 0;
// //}
// if (endBuffer[0].CompareTo((byte)0xFF) == 0 &&
// endBuffer[1].CompareTo((byte)0xD9) == 0 &&
// endBuffer[2].CompareTo((byte)0x7D) == 0) //0x7D 不是jpg结束标记,是‘}’
// {
// Int64 iImageEndPos = msStream.Position;
// int imageRealSize = (int)(iImageEndPos - imagePosStart-1);
// msStream.Seek(imagePosStart, SeekOrigin.Begin);
// byte[] imageBuff = new byte[imageRealSize];
// readMemBuffer(ref msStream, imageBuff, imageRealSize);
// if (onImageHandle != null)
// {
// onImageHandle(cID1, cID2, cID3, cID4, imageBuff);
// }
// int remain = (int)(msStream.Length - msStream.Position);
// byte[] remainBuffer = new byte[remain];
// readMemBuffer(ref msStream, remainBuffer, remain);
// msStream.SetLength(0);
// msStream.Write(remainBuffer, 0, remain);
// msStream.Seek(0, SeekOrigin.Begin);
// break;
// }
// else
// {
// msStream.Seek(-2, SeekOrigin.Current);
// }
//}
if (msStream.Length - msStream.Position < iImageSize)
{
int remain = iImageSize - (int)(msStream.Length - msStream.Position);
byte[] remainBuff = new byte[remain];
// int len = sockClient.Receive(remainBuff);
receiveToBuffer(ref sockClient, remainBuff, remain);
Int64 pos = msStream.Position;
msStream.Seek(0, SeekOrigin.End);
msStream.Write(remainBuff, 0, remain);
msStream.Seek(pos, SeekOrigin.Begin);
//msStream.
byte[] imageBuff = new byte[iImageSize];
readMemBuffer(ref msStream, imageBuff, iImageSize);
if (onImageHandle != null)
{
onImageHandle(cID1, cID2, cID3, cID4, imageBuff);
//Thread.Sleep(2000);
System.Diagnostics.Trace.WriteLine((debug_index++).ToString());
}
msStream.SetLength(0);
msStream.Seek(0, SeekOrigin.Begin);
// MemoryStream msImage = new MemoryStream(imageBuff);
// System.Drawing.Image image1 = System.Drawing.Image.FromStream(msImage);
// image1.Save("d:\\1.jpg");
}
}
else
{
msStream.Seek(-5, SeekOrigin.Current);
}
}
}
catch (System.Exception ex)
{
System.Diagnostics.Trace.WriteLine("thread exit except");
sockClient.Close();
return;
}
System.Diagnostics.Trace.WriteLine("thread exit nomal");
return;
}
private Thread _thread;
private string _addr;
private int _port;
private bool _bStop = false;
private Dictionary<int, PictureBox> _mapPictrueBox = new Dictionary<int, PictureBox>();
}