C# 屏幕监控问题
请帮助下小弟!自连的话可以看到自己,让别人连的话就错误了,客户端报错以下是服务端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;
namespace s
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private NetworkStream ns = null;
private StreamReader sr = null;
private StreamWriter sw = null;
private Thread tcpThread = null;
private TcpClient tcpclient = null;
MemoryStream ms = null;
bool isCon = false;
bool isError = false;
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, // 驱动名称
string lpszDevice, // 设备名称
string lpszOutput, // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
);
private void timer1_Tick(object sender, EventArgs e)
{
if (!isCon)
{
con();
if (!isError)
{
timer1.Enabled = false;
tcpThread = new Thread(new ThreadStart(connect));
tcpThread.Start();
}
isError = false;
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.label1.Text = "程序启动中....\r\n";
timer1.Enabled = true;
}
public void con()
{
try
{
this.label1.Text += "连接中.....\r\n";
tcpclient = new TcpClient();
tcpclient.Connect("119.130.241.45", 9421);
if (tcpclient.Connected)
{
ns = tcpclient.GetStream();
sr = new StreamReader(ns);
sw = new StreamWriter(ns);
isCon = true;
this.label1.Text += "连接成功\r\n";
}
//isError = true;
}
catch
{
isError = true;
this.label1.Text += "连接失败!\r\n";
}
}
public void capture()
{
//this.Visible = false;
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
System.Drawing.Image MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
ms = new MemoryStream();
MyImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
byte[] b =ms.GetBuffer();
Thread.Sleep(500);//延迟了
ns.Write(b, 0, b.Length);
ms.Flush();
// this.pictureBox1.Image = Image.FromStream(ms);
//this.Visible = true;
//while (sendCount < ms.Length) //分块传送
//{
// sendBuf = new Byte[1024];
// int count = ms.Read(sendBuf, 0, sendBuf.Length); //从图片中读出数据
// ns.Write(sendBuf, 0, count);
// sendCount += count;
//}
}
public void connect()
{
try
{
while (true)
{
capture();
}
}
catch (Exception ex)
{
// MessageBox.Show(ex.Message);
// MessageBox.Show("错误!===\\\\"+ex.Message );
sw.Dispose();
sr.Dispose();
ns.Dispose();
isCon = false;
isError = false;
timer1.Enabled = true;
this.label1.Text += "远程主机被断开~!";
}
}
}
}
以下是客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;
namespace c
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private TcpListener tcp = null;
private Socket socket = null;
private NetworkStream ns = null;
private StreamReader sr = null;
private StreamWriter sw = null;
private Thread tcpThread = null;
private void Form1_Load(object sender, EventArgs e)
{
tcpThread = new Thread(new ThreadStart(getRemote));
tcpThread.Start();
}
public void getRemote()
{
IPAddress ip = IPAddress.Parse("119.131.10.172");
tcp = new TcpListener(ip, 9421);
tcp.Start();
socket = tcp.AcceptSocket();
ns = new NetworkStream(socket);
sr = new StreamReader(ns);
sw = new StreamWriter(ns);
if (socket.Connected)
{
try
{
while (true)
{
byte[] b = new byte[4000 * 3000]; //设置接收的大小
int i = this.socket.Receive(b);//接收
//把byte[]转化成内存流,在把内存流转化成Image,
System.Drawing.Image myimage = System.Drawing.Image.FromStream(new MemoryStream(b));
showScreen.Image = myimage; //显示
}
// MessageBox.Show("连接成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.tcp.Stop();
MessageBox.Show("捕捉屏幕出错!server" + ex.Message); //这里报错了
}
}
}
}
} --------------------编程问答-------------------- up --------------------编程问答-------------------- 先确定一下
通讯成功没有? --------------------编程问答-------------------- tcpclient.Connect("119.130.241.45", 9421); 要连接的ip为你自己的ip --------------------编程问答-------------------- 太长了,没有时间看,直接把错误贴出来,分析错误,解决错误罢。
补充:.NET技术 , C#