C# 使用TCP通过网络发送位图时出现问题
我正在尝试用C#设置一个简单的桌面监控程序。我已经搜索了将近一个小时试图找到一个工作模型,但是我发现的任何东西要么抛出异常,要么太复杂,调用模糊的函数 我能够将屏幕捕获到位图实例,我曾尝试发送它,但目前程序运行正常并关闭。客户端抛出一个异常,因为连接没有正确关闭(懒惰的我!),但没有发生其他任何事情。没有写入输出文件,没有任何内容 这是服务器的代码C# 使用TCP通过网络发送位图时出现问题,c#,networking,bitmap,C#,Networking,Bitmap,我正在尝试用C#设置一个简单的桌面监控程序。我已经搜索了将近一个小时试图找到一个工作模型,但是我发现的任何东西要么抛出异常,要么太复杂,调用模糊的函数 我能够将屏幕捕获到位图实例,我曾尝试发送它,但目前程序运行正常并关闭。客户端抛出一个异常,因为连接没有正确关闭(懒惰的我!),但没有发生其他任何事情。没有写入输出文件,没有任何内容 这是服务器的代码 using System.IO; using System.Drawing; using System.Drawing.Imaging; using
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Net.Sockets;
using System;
class ScreenCapture
{
public static void Main()
{
try
{
TcpListener srv = new TcpListener(IPAddress.Any, 51530);
srv.Start(1);
TcpClient client = srv.AcceptTcpClient();
NetworkStream ns = client.GetStream();
StreamWriter send = new StreamWriter(ns);
StreamReader read = new StreamReader(ns);
Rectangle screenshot;
Bitmap bitmap;
screenshot = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
bitmap = new Bitmap(screenshot.Width, screenshot.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(screenshot.Left, screenshot.Top, 0, 0, screenshot.Size);
g.Dispose();
MemoryStream m = new MemoryStream();
bitmap.Save(m, ImageFormat.Jpeg);
byte[] data = m.ToArray();
Console.WriteLine(data.ToString());
send.Write(m);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadKey();
}
}
}
以下是客户代码:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Drawing;
using System.Drawing.Imaging;
class RetrieveScreenShot
{
public static void Main()
{
try
{
TcpClient client = new TcpClient("127.0.0.1", 51530);
NetworkStream ns = client.GetStream();
Image receivedImage = Image.FromStream(ns);
receivedImage.Save("output.bmp");
ns.Close();
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
}
接收器端的代码没有太大变化,只是文件扩展名
以下答案有助于解释这些变化:
首先,即使它工作正常,您的文件扩展名也是错误的<对我来说,code>ImageFormat.Jpeg意味着
output.jpg
。除此之外,我看到的另一件事是send.Write(m)
可能更好,因为发送.写入(数据)代码>目前这并不重要,因为我还在测试。我仍然可以查看照片,无论它有什么扩展。给出发送、写入(数据);现在就试试。我想试着正确地关闭连接,并将TcpClient
包装到一个using块中,至少在服务器端(以消除该异常)。尝试发送“data”而不是“m”,但它仍然做了同样的事情。我将把TcpClient更改为using
try
{
TcpListener srv = new TcpListener(IPAddress.Any, 51530);
srv.Start(1);
TcpClient client = srv.AcceptTcpClient();
NetworkStream ns = client.GetStream();
Rectangle screenshot;
Bitmap bitmap;
screenshot = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
bitmap = new Bitmap(screenshot.Width, screenshot.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(screenshot.Left, screenshot.Top, 0, 0, screenshot.Size);
g.Dispose();
MemoryStream m = new MemoryStream();
//you can also just save to network stream and skip the copy but i kept it for demo
bitmap.Save(m, ImageFormat.Jpeg);
//reset the memory stream to start of stream
m.Position = 0;
//copy memory stream to network stream
m.CopyTo(ns);
//make sure copy is completed
m.Flush();
m.Close();
//Makes sure everything is sent before closing it
ns.Flush();
//The Image.FromStream() seems to wait for the stream to be finished/closed.
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadKey();
}