2011-04-16 33 views
0

我正在嘗試使用wcf和net.tcp綁定將位圖從客戶端傳遞到服務器。如何使用WCF和net.tcp綁定來傳輸位圖?

這是我的代碼到目前爲止...請建議什麼是最好的方式來使它流的位圖?

public void ScreenShot() 
    { 
      ... 

     System.Drawing.Bitmap gdiBitmap = new System.Drawing.Bitmap(pictureBox1.Image); 

     apc.server.return_screenshot(name, gdiBitmap); 
     ///The socket connection was aborted. 
     ///This could be caused by an error processing your message or a receive timeout 
     ///being exceeded by the remote host, or an underlying network resource issue. 
     ///Local socket timeout was '00:00:59.9700000'. 
    } 

...

[ServiceContract(Namespace = "server", 
    CallbackContract = typeof(IfaceServer2Client), 
    SessionMode = SessionMode.Required)] 


    public interface IfaceClient2Server   ///// what comes from the client to the server. 
    { 
     [OperationContract(IsOneWay = true)] 
     void StartConnection(string clientName); 

     [OperationContract(IsOneWay = true)] 
     void Message_Cleint2Server(string msg); 

     [OperationContract(IsOneWay = true)] 
     void ret_listDrives(string n, List<TreeNode> nodeList); 

     [OperationContract(IsOneWay = true)] 
     void return_screenshot(string n, Bitmap img); /// <- here I'm trying to pass the bitmap. 
    } 


    public interface IfaceServer2Client   ///// what goes from the sertver, to the client. 
    { 
     [OperationContract(IsOneWay = true)] 
     void AcceptConnection(); 

     [OperationContract(IsOneWay = true)] 
     void RejectConnection(); 

     [OperationContract(IsOneWay = true)] 
     void Message_Server2Client(string msg); 

     [OperationContract(IsOneWay = true)] 
     void cmd_listDrives(); 

     [OperationContract(IsOneWay = true)] 
     void cmd_changeName(string n); 

     [OperationContract(IsOneWay = true)] 
     void cmd_screenshot(); 
    } 

謝謝!

編輯:

private void Form1_Load(object sender, EventArgs e) 
{ 
     duplex = new ServiceHost(typeof(ServerClass)); 

     NetTcpBinding tcp = new NetTcpBinding(); 

     duplex.AddServiceEndpoint(typeof(IfaceClient2Server), tcp, "net.tcp://localhost:9080/service"); 

     duplex.Open(); 
} 

回答

2

嘗試序列化位圖的存儲器流和把它交給作爲字節數組...

//編輯

例子:位圖 - >字節[ ] - >位圖

//lets get a dummy bitmap ... 
Bitmap bmp=new Bitmap(Width,Height); 
//... and paint the current form 
this.DrawToBitmap(bmp,new Rectangle(0,0,Width,Height)); 

//we want to get a byte[] representation ... a MemoryStreams buffer will do 
MemoryStream ms = new MemoryStream(); 
//save image to stream ... the stream will write it into the buffer 
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 

//get the buffer 
byte[] bitmapBytes = ms.GetBuffer(); 

//now you can transfer this byte array ... 

//on the receiver end you want to get your bitmap back... 
//create a new memorystream around the byte array 
ms = new MemoryStream(bitmapBytes); 
//read the Bitmap back 
bmp = (Bitmap)Bitmap.FromStream(ms); 
//use it ... 
pictureBox1.Image = bmp; 
+0

我對這個東西有點新...可以請您詳細解釋一下嗎? :) – Roger 2011-04-16 15:51:00

+0

在這裏你去... – DarkSquirrel42 2011-04-16 18:11:57

+0

謝謝!嗯......但它仍然顯示相同的錯誤,當我試圖傳遞字節[] bmpBytes ... ///套接字連接被中止。 ///這可能是由於處理您的消息時發生錯誤或遠程主機接收超時,或者底層網絡資源問題導致的。本地套接字超時爲'00:00:59.9950000'。 – Roger 2011-04-18 14:46:31