好的,所以我看到多個人遇到這個問題,並且我在某種程度上發現了可能導致問題的原因,但我無法弄清楚如何修復它。基本上,我試圖通過套接字從客戶端向服務器發送截圖。我把客戶端應用程序的屏幕截圖和使用此方法將其轉換爲一個字節數組:System.Drawing.ImageFromStream中的System.ArgumentException
// Convert bitmap to byte method
public static byte[] ImageToByte(Bitmap bitmap)
{
byte[] imageData;
using (var stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
imageData = stream.ToArray();
return imageData;
}
}
我然後發送字節數組的長度和字節數組到服務器。服務器,接收長度後,使用此方法獲取的實際數據(這是該方法的一部分,因爲其中大部分是不相關的):
void dataRecieveCallback(IAsyncResult ar)
{
try
{
int rec = sck.EndReceive(ar);
if (rec <= 0)
{
return;
}
recieveBuffer.bufStream.Write(recieveBuffer.buffer, 0, rec);
recieveBuffer.toRecieve -= rec;
if (recieveBuffer.toRecieve > 0)
{
Array.Clear(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length);
recieveBuffer.bufStream.Position = 0;
sck.BeginReceive(recieveBuffer.buffer, 0, recieveBuffer.buffer.Length, SocketFlags.None, dataRecieveCallback, null);
return;
}
// Convert all recieved data in memory stream to a byte array
byte[] finalBuffer = recieveBuffer.bufStream.ToArray();
我然後用finalBuffer
來嘗試獲得形象,但每當我做的,使用這種方法:
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
Bitmap screenShot = (Bitmap)tc.ConvertFrom(finalBuffer);
我總是System.ArgumentException
從System.Drawing.ImageFromStream
得到:「參數是無效的」。這段代碼在發送字符串方面效果很好,但每當我嘗試發送圖像時都不起作用。我非常確定這是套接字代碼的問題,因爲我嘗試了一下屏幕截圖,使用相同的方法將其轉換爲字節數組,然後使用相同的方法將其轉換回來,然後運行。有人知道我的代碼在這裏有什麼問題嗎?
下面是代碼的一部分用於緩衝
struct RecBuffer
{
public const int BUFFER_SIZE = 1024;
public byte[] buffer;
public int toRecieve;
public MemoryStream bufStream;
public RecBuffer(int toRec)
{
buffer = new byte[BUFFER_SIZE];
toRecieve = toRec;
bufStream = new MemoryStream(toRecieve);
}
}
我用相當多的代碼從this tutorial。至少在接收部分。
你調試了finalBuffer Byte [],看看它們是否與源字節[]匹配?至少可以比較長度和第一個字節。您的接收方法看起來很奇怪。這個recieveBuffer是什麼類? – KroaX
對不起,我應該發佈更多的代碼。 recieveBuffer的代碼如下所示:struct RecBuffer { public const int BUFFER_SIZE = 1024; public byte [] buffer; public int toRecieve; public MemoryStream bufStream; public RecBuffer(int toRec) { buffer = new byte [BUFFER_SIZE]; toRecieve = toRec; bufStream = new MemoryStream(toRecieve); }'我使用了很多這些傢伙代碼:http://www.youtube.com/watch?v=PCwS7F2uK3Q – user1742916
我把這段代碼放到你原來的帖子中。這樣就不能正確讀取。那麼你是否已經檢查了接收字節[]? – KroaX