/**显示线程*/ private void dispalyBitmapFun() { while (isConnect) { try { BitmapWithCursor bitmapWithCursor = displayQueue.Dequeue(); if (bitmapWithCursor != null) { RecPacket.PacketType packetType = bitmapWithCursor.getPacketType(); switch (packetType) { case RecPacket.PacketType.BITMAP: Bitmap display = bitmapWithCursor.getScreenBitmap(); // Point cursorPoint = new Point(bitmapWithCursor.getCursorPoint().getXPoint(), bitmapWithCursor.getCursorPoint().getYPoint()); //using (Graphics g = Graphics.FromImage(bitmapWithCursor.getScreenBitmap())) //{ // Cursor myCursor = Cursor.Current; // myCursor.Draw(g, new Rectangle(cursorPoint, new Size(10, 10))); // g.Dispose(); //} bitmapWidth = display.Width; bitmapHeight = display.Height; scaleX = (float)pictureBoxRec.Width / bitmapWidth; scaleY = (float)pictureBoxRec.Height / bitmapHeight; pictureBoxRec.BackgroundImage = display; labeldispalyQueue.Text = "显示队列大小:" + displayQueue.getQueueSize() + "\r\n"; break; case RecPacket.PacketType.TEXT: textBoxInfo.Text = bitmapWithCursor.getStringValue(); labeldispalyQueue.Text = "显示队列大小:" + displayQueue.getQueueSize() + "\r\n"; break; default: break; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
/**解压线程*/ private void deCompressFun() { while (isConnect) { try { RecPacket recPacket = recPacketQueue.Dequeue(); LZOCompressor lzoCompress = new LZOCompressor(); if (recPacket != null) { RecPacket.PacketType packetType = recPacket.getPacketType(); DifferentBitmapWithCursor difbitWithCur = new DifferentBitmapWithCursor(); difbitWithCur.setPacketType(packetType); switch (packetType) { case RecPacket.PacketType.BITMAP: difbitWithCur.setBitmapType(recPacket.getBitmapType()); difbitWithCur.setCursorPoint(recPacket.getCursorPoint()); difbitWithCur.setDifPointsList(recPacket.getDifPointsList()); byte[] dataBytes = recPacket.getBitByts(); byte[] getByte = lzoCompress.Decompress(dataBytes); Bitmap temp = (Bitmap)Bitmap.FromStream(new MemoryStream(getByte)); difbitWithCur.setDifBitmap(temp); /**放入差异队列*/ deCompressDifQueue.Enqueue(difbitWithCur); labelDif.Text = "差异队列大小:" + deCompressDifQueue.getQueueSize() + "\r\n"; break; case RecPacket.PacketType.TEXT: difbitWithCur.setStringValue(recPacket.getStringValue()); deCompressDifQueue.Enqueue(difbitWithCur); labelDif.Text = "差异队列大小:" + deCompressDifQueue.getQueueSize() + "\r\n"; break; default: break; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
/** * 控制扫描块的大小,块越大,扫描速度越快,但是发送的数据量就越大; * 块越小,扫描速度就越慢,但是发送的数据量就小; * 局域网一般100*100 * 广域网一般40*40 或 20*20 * 是否需要协商块的大小????进一步实验决定。默认的事30*30, * 现在已经完全由server决定,client不需要blocksize **/ //private static Size bitCmpSize = new Size(30, 30); /**图形恢复函数*/ private void recoverBitmapFun() { while (isConnect) { try { DifferentBitmapWithCursor difbitWithCur = deCompressDifQueue.Dequeue(); if (difbitWithCur != null) { RecPacket.PacketType packetType = difbitWithCur.getPacketType(); BitmapWithCursor bitmapWithCursor = new BitmapWithCursor(); bitmapWithCursor.setPacketType(packetType); switch (packetType) { case RecPacket.PacketType.BITMAP: RecPacket.BitmapType type = difbitWithCur.getBitmapType(); ShortPoint cursorpoint = difbitWithCur.getCursorPoint(); Bitmap btm = difbitWithCur.getDifBitmap(); List <ShortRec> difPoints = difbitWithCur.getDifPointsList(); switch (type) { case RecPacket.BitmapType.BLOCK: //Stopwatch sw = new Stopwatch(); //sw.Start(); Bitmap recBitmap = RecoverBitmap.recoverScreenBitmap(difPoints, globalCompareBitmap, btm /*, bitCmpSize*/); //sw.Stop(); //Console.WriteLine("client:"+sw.ElapsedMilliseconds+"ms"); bitmapWithCursor.setCursorPoint(cursorpoint); bitmapWithCursor.setScreenBitmap(recBitmap); globalCompareBitmap = (Bitmap)recBitmap.Clone(); /**放到显示队列*/ displayQueue.Enqueue(bitmapWithCursor); break; case RecPacket.BitmapType.COMPLETE: updateKeyFrame(btm, cursorpoint); break; default: break; } labeldispalyQueue.Text = "显示队列大小:" + displayQueue.getQueueSize() + "\r\n"; break; case RecPacket.PacketType.TEXT: bitmapWithCursor.setStringValue(difbitWithCur.getStringValue()); displayQueue.Enqueue(bitmapWithCursor); labeldispalyQueue.Text = "显示队列大小:" + displayQueue.getQueueSize() + "\r\n"; break; default: break; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
/**数据接收函数*/ private void recPacketFun(object clientSocket) { NetworkStream stream = new NetworkStream((Socket)clientSocket); BinaryReader reader = new BinaryReader(stream); while (isConnect) { try { RecPacket recpacket = new RecPacket(); RecPacket.PacketType packetType = (RecPacket.PacketType)reader.ReadByte(); recpacket.setPacketType(packetType); switch (packetType) { case RecPacket.PacketType.BITMAP: int bitmapBytesLen = reader.ReadInt32(); RecPacket.BitmapType type = (RecPacket.BitmapType)reader.ReadByte(); short cursorPointX = reader.ReadInt16(); short cursorpointY = reader.ReadInt16(); short difNum = reader.ReadInt16(); if (difNum > 0) { List <ShortRec> difPoints = new List <ShortRec>(); for (int i = 0; i < difNum; i++) { short xpoint = reader.ReadInt16(); short ypoint = reader.ReadInt16(); short width = reader.ReadInt16(); short height = reader.ReadInt16(); ShortRec difPoint = new ShortRec(xpoint, ypoint, width, height); difPoints.Add(difPoint); } recpacket.setDifPointsList(difPoints); } int size = 0; byte[] getBitmapBytes = new byte[bitmapBytesLen]; while (size < bitmapBytesLen) { size += reader.Read(getBitmapBytes, size, bitmapBytesLen - size); } /**组装数据*/ recpacket.setBitByts(getBitmapBytes); recpacket.setBitmapBytesLength(bitmapBytesLen); recpacket.setBitmapType(type); recpacket.setCursorPoint(new ShortPoint(cursorPointX, cursorpointY)); /**添加到接收队列*/ recPacketQueue.Enqueue(recpacket); labelQueueCap.Text = "接收队列大小:" + recPacketQueue.getQueueSize() + "\r\n"; break; case RecPacket.PacketType.TEXT: int textLen = reader.ReadInt32(); int textSize = 0; byte[] getTextBytes = new byte[textLen]; while (textSize < textLen) { textSize += reader.Read(getTextBytes, textSize, textLen - textSize); } recpacket.setStringValue(Encoding.UTF8.GetString(getTextBytes)); /**添加到接收队列*/ recPacketQueue.Enqueue(recpacket); labelQueueCap.Text = "接收队列大小:" + recPacketQueue.getQueueSize() + "\r\n"; break; default: break; } } catch (Exception ex) { MessageBox.Show(ex.Message); stopClient(); Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); ErrorInfo.getErrorWriter().writeErrorMassageToFile(DateTime.Now.ToString() + ":" + ex.Message + "\r\n" + ex.StackTrace); } } }
public void setPacketType(RecPacket.PacketType packetType) { this.packetType = packetType; }