C#局域网TCP桌面监控,客户端不明原因卡死。 局域网tcp远程控制C#窗体应用程序 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器端:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.IO;using System.Threading;namespace Server{ public partial class Server : Form { public Server() { InitializeComponent(); } private void Server_Load(object sender, EventArgs e) { } Thread MainThread; Thread ScreenThread; Socket socket; [System.Runtime.InteropServices.DllImport("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, //目标设备的句柄 int nXDest, //目标对象的左上角x坐标 int nYDest, //目标对象的左上角Y坐标 int nWidth, //目标对象的矩形宽度 int nHeight, //目标对象的矩形长度 IntPtr hdcSrc, //源设备的句柄 int nXSrc, //源对象的左上角x坐标 int nYSrc, //源对象的左上角y坐标 System.Int32 dwRop //光栅的操作值 ); [System.Runtime.InteropServices.DllImport("gdi32.dll")] private static extern IntPtr CreateDC( string lpszDriver, //驱动名称 string lpszDevice, //设备名称 string lpszOutput, //无用,设为null IntPtr lpInitData //任意的打印机数据 ); //获取Server的IP地址 public static IPAddress GetServerIP() { IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName()); return ieh.AddressList[0]; } //监听 端口:8888 private void BeginListen() { IPAddress ServerIp = GetServerIP(); IPEndPoint iep = new IPEndPoint(ServerIp, 8888); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(iep); while (true) { try { socket.Listen(10); byte[] CommandData = new byte[2]; Socket newSocket = socket.Accept(); newSocket.Receive(CommandData); string command = Encoding.Default.GetString(CommandData); //判断命令 if (command == "00")//屏幕监控开启 { ScreenSend(); } else if (command == "01") { ScreenThread.Abort();//屏幕监控关闭 } } catch (System.Exception er) { } } } //屏幕图像传输 private void ScreenSend() { IPAddress ServerIp = GetServerIP(); IPEndPoint iep = new IPEndPoint(ServerIp, 9999); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(iep); while (true) { try { socket.Listen(5); Socket ScreenSocket = socket.Accept(); ScreenTimer.Enabled = true; } catch { } } } //屏幕监控 private void ScreenMonitor() { /*Screen scr = Screen.PrimaryScreen; Rectangle rc = scr.Bounds; int iWidth = rc.Width; int iHeight = rc.Height; Size mySize = new Size(rc.Width, rc.Height); Image bitmap = new Bitmap(iWidth, iHeight); Graphics g = Graphics.FromImage(bitmap); g.CopyFromScreen(0,0,0,0,mySize); bitmap.Save(@"c:/1.jpg");*/ IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null); //创建显示器DC Graphics g1 = Graphics.FromHdc(dc1); //由一个指定设备的句柄创建一个新的Graphics对象 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); //Bitblt(源场景,0,0,位图信息.位图宽度,位图信息.位图高度,桌面句柄,0,0,13369376) PS:SRCCOPY 13369376 将源矩形图象直接复制到目标矩形上 g1.ReleaseHdc(dc3); //释放屏幕句柄 g2.ReleaseHdc(dc2); //释放位图句柄 MyImage.Save("C:/MyJpeg.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); MemoryStream ms = new MemoryStream(); MyImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] bytes = ms.GetBuffer(); ms.Close(); socket.Send(bytes); } //屏幕定时器 private void ScreenTimer_Tick(object sender, EventArgs e) { ScreenMonitor(); } //开启监听进程 BeginListen private void StartServer_Click(object sender, EventArgs e) { try { MainThread = new Thread(new ThreadStart(BeginListen)); MainThread.Start(); } catch (System.Exception er) { } } //关闭所有进程 private void StopServer_Click(object sender, EventArgs e) { socket.Close(); MainThread.Abort(); } }}我刚刚开始研究着做,希望大家能多多帮助我~ 第二个窗口没用线程,这里就卡死了 while (true) { try { socket.Connect(iep); byte[] bytePicture = new byte[300 * 1024]; socket.Receive(bytePicture); MemoryStream ms = new MemoryStream(bytePicture); Image bm = Image.FromStream(ms); ms.Close(); pictureBox1.Image = bm; } catch { } } 楼主你需的是这个http://download.csdn.net/detail/fengart/173494 看他的原码你就知了。他有你所需的全部功能。。还是加强版哦 draw code 128c source .net silverlight很少人用了,有一些“安全”方面的坑拦住了许多人。silverlight访问tcp服务器,要注意两点:1. 要提供 943 端口安全认证。2. 服务器端口必须在 4502-4534 之间。其实这两点还不算变态,最变态的(也是微软最混蛋的)地方是,如果有问题,那么silverlight直接以“死机”作为对待,而不是给用户报告一个确定的异常信息。我实在想不明白为什么微软为什么会这样设计,这明显是想让自己的产品死掉的节奏啊?! winform的控件怎么实现半透明? 如何把图片先加载到内存中 语法错误 (操作符丢失) 在查询表达式 数据集的Fill(DataSet dataSet,string srcTable)方法后面的srcTable是哪里的表啊? 书上代码没看懂,望高手解答? 有多少公司现在用VS.net做C/S项目? 关于收取邮件附件的问题? 求助贴:如何做一个具有播放功能的网站 最简单问题送分了 本公司招图形设计方面的程序员 成员和字段的概念 VS2013,WPF问题
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;namespace Server
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
} private void Server_Load(object sender, EventArgs e)
{ } Thread MainThread;
Thread ScreenThread;
Socket socket; [System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, //目标对象的左上角x坐标
int nYDest, //目标对象的左上角Y坐标
int nWidth, //目标对象的矩形宽度
int nHeight, //目标对象的矩形长度
IntPtr hdcSrc, //源设备的句柄
int nXSrc, //源对象的左上角x坐标
int nYSrc, //源对象的左上角y坐标
System.Int32 dwRop //光栅的操作值
); [System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr CreateDC(
string lpszDriver, //驱动名称
string lpszDevice, //设备名称
string lpszOutput, //无用,设为null
IntPtr lpInitData //任意的打印机数据
); //获取Server的IP地址
public static IPAddress GetServerIP()
{
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
return ieh.AddressList[0];
} //监听 端口:8888
private void BeginListen()
{
IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, 8888);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(iep);
while (true)
{
try
{
socket.Listen(10);
byte[] CommandData = new byte[2];
Socket newSocket = socket.Accept();
newSocket.Receive(CommandData);
string command = Encoding.Default.GetString(CommandData);
//判断命令
if (command == "00")//屏幕监控开启
{
ScreenSend();
}
else if (command == "01")
{
ScreenThread.Abort();//屏幕监控关闭
}
}
catch (System.Exception er)
{
}
}
} //屏幕图像传输
private void ScreenSend()
{
IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, 9999);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(iep); while (true)
{
try
{
socket.Listen(5);
Socket ScreenSocket = socket.Accept();
ScreenTimer.Enabled = true;
}
catch { }
}
} //屏幕监控
private void ScreenMonitor()
{
/*Screen scr = Screen.PrimaryScreen;
Rectangle rc = scr.Bounds;
int iWidth = rc.Width;
int iHeight = rc.Height;
Size mySize = new Size(rc.Width, rc.Height);
Image bitmap = new Bitmap(iWidth, iHeight); Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(0,0,0,0,mySize); bitmap.Save(@"c:/1.jpg");*/ IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
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);
//Bitblt(源场景,0,0,位图信息.位图宽度,位图信息.位图高度,桌面句柄,0,0,13369376) PS:SRCCOPY 13369376 将源矩形图象直接复制到目标矩形上
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
MyImage.Save("C:/MyJpeg.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); MemoryStream ms = new MemoryStream();
MyImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
ms.Close();
socket.Send(bytes);
} //屏幕定时器
private void ScreenTimer_Tick(object sender, EventArgs e)
{
ScreenMonitor();
} //开启监听进程 BeginListen
private void StartServer_Click(object sender, EventArgs e)
{
try
{
MainThread = new Thread(new ThreadStart(BeginListen));
MainThread.Start();
}
catch (System.Exception er)
{
}
} //关闭所有进程
private void StopServer_Click(object sender, EventArgs e)
{
socket.Close();
MainThread.Abort();
}
}
}
我刚刚开始研究着做,希望大家能多多帮助我~
第二个窗口没用线程,这里就卡死了 while (true)
{
try
{
socket.Connect(iep);
byte[] bytePicture = new byte[300 * 1024];
socket.Receive(bytePicture);
MemoryStream ms = new MemoryStream(bytePicture);
Image bm = Image.FromStream(ms);
ms.Close();
pictureBox1.Image = bm;
}
catch { }
}
楼主你需的是这个
http://download.csdn.net/detail/fengart/173494 看他的原码你就知了。他有你所需的全部功能。。还是加强版哦
1. 要提供 943 端口安全认证。
2. 服务器端口必须在 4502-4534 之间。其实这两点还不算变态,最变态的(也是微软最混蛋的)地方是,如果有问题,那么silverlight直接以“死机”作为对待,而不是给用户报告一个确定的异常信息。我实在想不明白为什么微软为什么会这样设计,这明显是想让自己的产品死掉的节奏啊?!