Reputation: 6527
I'm trying to pass a bitmap from a client to server using wcf and net.tcp binding.
Here's my code so far... please suggest what would be the best way to make it stream that bitmap?
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();
}
Thanks!
edit:
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();
}
Upvotes: 1
Views: 3980
Reputation: 10257
try serializing the bitmap to a memory stream and hand it over as a byte array ...
//edit
example: Bitmap -> byte[] -> Bitmap
//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;
Upvotes: 3