`
peizhiinfo
  • 浏览: 1492728 次
文章分类
社区版块
存档分类
最新评论

局域网控制(一)界面传输

 
阅读更多

突然想起来用API结合C#的网络编程来做点东西!

结合Socket通信及Windows API,通过发送或接收数据来执行相应的操作,可以实现对某台计算机操作。下面就一个简单的局域网控制实例来说明这一过程,具体可以通过一个客户端和一个控制端来实现,客户端主要运行在客户计算机上(即被控制的计算机上),控制端运行在服务器主机上。

无论是对于客户端还是控制端,都必须包含发送数据至目标计算机上和接受目标计算机上的数据这两部分,这个过程主要通过Socket通信来实现。至于具体发送什么数据以及如何将这些数据来转换成计算机指令,则主要是API的事情了。

首先新建一个客户端项目,其界面上主要的控件及控件名称如下图所示:

图片

然后新建一个控制端项目,其界面上主要的控件及控件名称如下图所示:


图片

1、界面传输

首先来实现将客户端的界面传送至控制端,这个过程主要包括两个部分:在客户端传输本机界面至控制端、在控制端接受传输的数据。具体来说,在客户端传输本机界面至控制端又分为获取界面图像、将图形转换成传输数据(如字节)、传输数据。同样,在控制端接受传输的数据在接受数据流后,将数据流转换成字节后还需要转换成图形。下面来分别介绍这五个关键点如何来实现:

1)获取界面图像

获取界面图像主要通过BitBlt()CreateDC()来实现,首先必须对这两个函数进行引用,如下:

【客户端】:

[System.Runtime.InteropServices.DllImportAttribute("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, // 源对象的左上角的X坐标

System.Int32 dwRop // 光栅的操作值

);

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]

private static extern IntPtr CreateDC(

string lpszDriver, // 驱动名称

string lpszDevice, // 设备名称

string lpszOutput, // 无用,可以设定位"NULL"

IntPtr lpInitData // 任意的打印机数据

);

然后定义一个获取屏幕的函数GetScreenImage(),其返回值为Bitmap,该函数代码如下:

【客户端】:

private Bitmap GetScreenImage(Point point01, Point point02, bool full)

{

//创建显示器的DC

IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);

//由一个指定设备的句柄创建一个新的Graphics对象

Graphics g1 = Graphics.FromHdc(dc1);

Bitmap MyImage;

int width, height;

if (full)

{

width = Screen.PrimaryScreen.Bounds.Width;

height = Screen.PrimaryScreen.Bounds.Height;

}

else

{

width = point02.X - point01.X;

height = point02.Y - point01.Y;

}

//根据指定的宽度和高度创建一个与之相同大小的Bitmap对象

MyImage = new Bitmap(width, height, g1);

//获得屏幕的句柄

Graphics g2 = Graphics.FromImage(MyImage);

//获得位图的句柄

IntPtr dc3 = g1.GetHdc();

//把当前屏幕捕获到位图对象中

IntPtr dc2 = g2.GetHdc();

//把当前屏幕拷贝到位图中

BitBlt(dc2, 0, 0, width, height, dc3, point01.X, point01.Y, 13369376);

//释放屏幕句柄

g1.ReleaseHdc(dc3);

//释放位图句柄

g2.ReleaseHdc(dc2);

return MyImage;

}

2)转换图像至字节

转换图像为字节可以采用MemoryStream类来实现,通过该类将图像读入内存流中,然后使用该类的ToArray()方法将数据流转换成字节数组,如下代码:

Point point01 = new Point(), point02 = new Point();

Bitmap bitmap = GetScreenImage(point01, point02, true);

MemoryStream memoryStream = new MemoryStream(); bitmap.Save(memoryStream,System.Drawing.Imaging.ImageFormat.Bmp);

byte[] bytes = memoryStream.ToArray();

3)发送字节至控制端

发送数据主要还是采用TcpClient类来实现,通过TcpClient类连接控制端,如果连接成功则将图像转换成字节数据,并发送出去。如下代码:

【客户端】:

private void SendImage()

{

TcpClient client = new TcpClient();

Int32 port = Int32.Parse(portTextBox.Text);

client.Connect(IPAddress.Parse(IPAddressTextBox.Text), port);

if (client.Connected)

{

Point point01 = new Point(), point02 = new Point();

Bitmap bitmap = GetScreenImage(point01, point02, true);

MemoryStream memoryStream = new MemoryStream();

bitmap.Save(memoryStream,System.Drawing.Imaging.ImageFormat.Bmp);

byte[] bytes = memoryStream.ToArray();

NetworkStream stream = client.GetStream();

stream.Write(bytes, 0, bytes.Length);

stream.Close();

client.Close();

}

}

在需要发送本机界面至控制端上,只需要调用SendImage()函数即可。

4将字节转换成图形

这个过程是在控制端获得客户端发送的数据后,通过接收的数据转换成图形。同样是采用MemoryStream类将字节数组读入内存流,然后使用Image类的FromStream()方法将数据流转换成图像,如下代码:

MemoryStream memoryStream = new MemoryStream();

byte[] bytes = new byte[1024];

int i;

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)

{

memoryStream.Write(bytes, 0, i);

}

Image image = Image.FromStream(memoryStream);

其中,stream是获取的网络数据流,即接收的客户端传输的数据。

5)控制端接收数据

在控制端接收数据仍然采用TcpListener类来监听客户端发送的数据,如果有数据传输过来,就将其转换成图像。所以首先要在全局中定义TcpListener类,如下:

【控制端】:

TcpListener tcpListener;

然后定义监听函数用于监听客户端发送的数据,如下:

【控制端】:

private void Listen()

{

try

{

Int32 port = Int32.Parse(portTextBox.Text);

tcpListener = new TcpListener(port);

tcpListener.Start();

while (true)

{

TcpClient client = tcpListener.AcceptTcpClient();

NetworkStream stream = client.GetStream();

if (stream.CanRead)

{

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

MemoryStream memoryStream = new MemoryStream();

byte[] bytes = new byte[1024];

int i;

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)

{

memoryStream.Write(bytes, 0, i);

}

Image image = Image.FromStream(memoryStream);

ClientPictureBox.Image= image;

memoryStream.Close();

}

client.Close();

}

}

finally

{

tcpListener.Stop();

}

}

在控制端用一个PictureBox控件(设置其Name属性为ClientPictureBox)来显示从客户端返回的界面,运行程序,其结果如下图所示:

图片

分享到:
评论

相关推荐

    飞鸽传输软件(实现在局域网内大文件快速传输)

    飞鸽传输软件是一款专为局域网设计的高效文件传输工具,它允许用户在无需安装的情况下,通过执行`.EXE`可执行文件实现快速、便捷的文件共享与交流。这款软件特别适合在企业、学校或者家庭网络环境中,帮助用户轻松地...

    C#版的局域网飞鸽(传输文件)

    标题中的"C#版的局域网飞鸽"是一款基于C#编程语言开发的应用程序,它主要功能是实现在局域网内的文件传输和聊天。这个项目可能是为了方便局域网内的用户快速、便捷地分享文件和进行即时通信,类似于知名的飞鸽传书...

    局域网文件和文本传输工具(C#源码)

    这个开源项目为学习C#网络编程和局域网通信提供了很好的实例,开发者可以通过阅读源码了解如何利用C#实现文件和文本的局域网传输,同时也可以根据自己的需求对其进行修改和扩展,如增加身份验证、权限控制等高级功能...

    局域网内最快的传输工具

    在IT领域,尤其是在日常工作中,快速有效地在局域网(LAN)内传输文件是一个常见的需求。局域网内的文件传输工具通常比通过互联网共享文件更快,因为它们利用了本地网络的高速连接。针对这一需求,一种名为“飞鸽传...

    局域网内的TCP传输

    基于c#,TCP的局域网文件传输, 有界面和源码,非常适用

    基于esp8266局域网控制

    开发者通常会使用Android Studio或其他移动开发平台,创建一个用户友好的界面,允许用户远程控制家电。应用程序需要能够连接到ESP8266所在的局域网,并发送控制命令。 5. **安全性考虑**:在实现这种远程控制时,...

    C#局域网控制(源代码)

    【C#局域网控制(源代码)】项目是一个初学者级别的编程实践,旨在实现对局域网内设备的控制功能。在这个项目中,开发者可能使用了C#语言的网络编程库,如System.Net和System.Net.Sockets,来创建客户端和服务端的...

    局域网聊天文件传输软件

    综上所述,局域网聊天文件传输软件是一个结合了网络通信、文件操作、用户界面设计等多个IT领域知识的实用工具。它简化了在局域网环境中的协作流程,提升了工作效率,同时也考虑到了用户隐私和数据安全。

    局域网文件传输工具

    本文将深入探讨一种名为“局域网文件传输工具”的实用软件,它能帮助用户在局域网内便捷地实现两台计算机之间的文件传输。 首先,我们要理解这种工具的基本功能。它主要服务于在内网环境中运行的用户,使得两台...

    基于QT的局域网文件传输

    TCP(传输控制协议)提供了一种可靠的、面向连接的通信方式,确保数据的顺序传输和错误校验,适合大文件的传输。而UDP(用户数据报协议)则更轻量级,无连接且不保证数据顺序,适用于对实时性要求高的场景,如视频流...

    lan.zip_java 局域网_lan_传输文件_界面端传输

    本项目“lan.zip”提供了一个用Java实现的局域网内文件传输解决方案,它包含一个带有图形用户界面(GUI)的客户端和服务器端。以下是关于这个项目的一些关键知识点和详细说明: 1. **Java编程语言**:Java是一种...

    飞鸽局域网文件传输软件

    "飞鸽局域网文件传输软件"就是这样一款专为满足这种需求而设计的高效工具。它无需依赖互联网连接,只需在局域网内的两台或多台电脑上安装即可实现文件的高速传输。 飞鸽传输软件的核心功能在于其局域网内的高速传输...

    用VB实现局域网内的文件传输

    8. **权限和安全**:在局域网内进行文件传输时,还需要考虑安全问题,如身份验证、权限控制等。虽然这个项目可能没有深入到这些细节,但了解这些概念对于构建更安全的系统是必要的。 以上就是用VB实现局域网内的...

    利用UDP进行局域网内的文件传输

    UDP是一种无连接、不可靠的传输协议,它不提供顺序保证、错误校验或重传机制,但因其高效和低延迟特性,常用于实时数据传输如音频、视频流或游戏等场景,同时也适用于对速度要求较高而可以容忍数据丢失的文件传输。...

    局域网中实现文件传输

    这是一个基于winsock的网络编程,主要实现局域网内文件传输的功能,里面包括代码和文件传输的界面,完全可以运行

    c# 局域网文件传输工具

    【C# 局域网文件传输工具】应运而生,解决了一系列传统方法所带来的问题。 首先,该工具在设计上专门针对局域网环境进行了优化,突破了传统即时通讯软件传输大文件时的限制。在局域网环境下,文件的传输速度可以...

    基于udp的局域网聊天及文件传输程序

    标题中的“基于udp的局域网聊天及文件传输程序”是指使用UDP(User Datagram Protocol)协议在局域网内实现的通信应用。UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的顺序和完整性,但因为其简单高效的...

    C# 局域网文件传输与聊天程序源码

    本项目名为"C# 局域网文件传输与聊天程序源码",它提供了一个使用C#实现的本地网络文件传输和聊天功能的示例。这个程序基于Winform窗体,是Windows应用程序开发的基础部分。 首先,我们要理解局域网(LAN)文件传输...

    java局域网文件传输

    在IT领域,尤其是在Java编程中,局域网文件传输是一个常见的需求,比如在多台设备间共享文件或者在分布式系统中传递数据。本项目聚焦于使用Java实现这一功能,通过局域网(LAN)实现文件的高效、安全传输。下面我们...

Global site tag (gtag.js) - Google Analytics