123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- /*----------------------------------------------------------------
- // Copyright (C) 2007 liu523@QQ.COM
- // 版权所有。
- // 开发者:liu523@QQ.COM团队
- // 文件名:Servers.cs
- // 文件功能描述:总的服务端,包括文件服务,屏幕发送服务等等,响应客户端的所有操作
- //----------------------------------------------------------------*/
- using System;
- using System.Text;
- using System.Windows.Forms;
- using System.Net.Sockets;
- using System.Threading;
- using System.IO;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Runtime.Serialization;
- using Server;
- using RemoteControlLib.Codes;
- using RemoteControlLib.Hooks;
- using RemoteControlLib.Bases;
- using RemoteControlLib.Windows;
- using RemoteControlLib.Common;
- namespace Servers
- {
- /// <summary>
- /// 被控制端
- /// </summary>
- public class Servers
- {
- /// <summary>
- /// 主服务端
- /// </summary>
- private BaseServer mainServer;
- /// <summary>
- /// 屏幕服务端
- /// </summary>
- private ScreenServer screenServer;
- /// <summary>
- /// 文件服务端
- /// </summary>
- private FileServer fileServer;
- /// <summary>
- /// 主服务线程
- /// </summary>
- private Thread mainThread;
- /// <summary>
- /// 文件服务线程
- /// </summary>
- private Thread fileThread;
- /// <summary>
- /// 屏幕服务线程
- /// </summary>
- private Thread screenThread;
- /// <summary>
- /// 各种服务端口
- /// </summary>
- private int mainPort, screenPort, filePort;
- /// <summary>
- /// 服务端的程序名
- /// </summary>
- private string productName;
- /// <summary>
- /// 版本
- /// </summary>
- private string version;
- /// <summary>
- /// 服务端的程序名
- /// </summary>
- public string ProductName
- {
- get { return productName; }
- set { productName = value; }
- }
-
- /// <summary>
- /// 版本
- /// </summary>
- public string Version
- {
- get { return version; }
- set { version = value; }
- }
- /// <summary>
- /// 日志列表
- /// </summary>
- public ListView ltv_Log;
- /// <summary>
- /// 显示信息的标签
- /// </summary>
- public ToolStripStatusLabel lbl_Message;
- /// <summary>
- /// 返回Servers(被控制端)的一个实例
- /// </summary>
- /// <param name="mainPort">主服务端口</param>
- /// <param name="filePort">文件传输端口</param>
- /// <param name="screenPort">屏幕传输端口</param>
- public Servers(int mainPort,int filePort,int screenPort)
- {
- this.mainPort = mainPort;
- this.screenPort = screenPort;
- this.filePort = filePort;
- this.version = "1.0.0.0";
- }
- /// <summary>
- /// 运行
- /// </summary>
- public void Run()
- {
- try
- {
- OpenMainServer();
- OpenScreenServer();
- OpenFileServer();
- }
- catch
- {
- Close();
- MessageBox.Show("通讯端口被占用!");
- }
- }
- /// <summary>
- /// 关闭所有连接
- /// </summary>
- public void Close()
- {
- if (fileServer != null)
- fileServer.CloseConnections();
- if (screenServer != null)
- screenServer.CloseConnections();
- if (mainServer != null)
- mainServer.CloseConnections();
- if (fileThread!=null&& fileThread.IsAlive) fileThread.Abort();
- if (screenThread != null && screenThread.IsAlive) screenThread.Abort();
- if (mainThread != null && mainThread.IsAlive) mainThread.Abort();
- }
- /// <summary>
- /// 重新启动服务端
- /// </summary>
- private void ReStart()
- {
- Close();
- Thread.Sleep(1000);
- Thread NewThread = new Thread(new ThreadStart(Run));
- NewThread.Start();
- }
- /// <summary>
- /// 打开主服务端
- /// </summary>
- private void OpenMainServer()
- {
- mainServer = new BaseServer(mainPort);
- mainServer.Execute = new ExecuteCodeEvent(mainExecuteCode);
- mainThread = new Thread(new ThreadStart(mainServer.Run));
- mainThread.Start();
- }
- /// <summary>
- /// 打开文件服务端
- /// </summary>
- /// <param name="code"></param>
- private void OpenFileServer()
- {
- fileServer = new FileServer(filePort);
- fileThread = new Thread(new ThreadStart(fileServer.Run));
- fileThread.Start();
- }
- /// <summary>
- /// 打开屏幕服务端
- /// </summary>
- /// <param name="code"></param>
- private void OpenScreenServer()
- {
- screenServer = new ScreenServer(screenPort);
- screenThread = new Thread(new ThreadStart(screenServer.Run));
- screenThread.Start();
- }
- /// <summary>
- /// 执行指令
- /// </summary>
- /// <param name="msg">指令</param>
- private void mainExecuteCode(BaseCommunication sender, Code code)
- {
- switch (code.Head)
- {
- case CodeHead.CONNECT_OK:
- //连接成功
- displayMessage(code);
- break;
- case CodeHead.HOST_MESSAGE:
- //发送主机信息
- sendHostMessage();
- sendReady();
- sendVersion();
- break;
- case CodeHead.SHUTDOWN:
- //关机
- WindowsManager.ShutDown();
- break;
- case CodeHead.REBOOT:
- WindowsManager.Reboot();
- // 重启计算机.
- break;
- case CodeHead.SPEAK:
- //对话
- displayMessage(code);
- break;
- case CodeHead .CLOSE_APPLICATION:
- //关闭程序
- Close();
- Application.ExitThread();
- Application.Exit();
- break;
- case CodeHead.CONNECT_RESTART:
- //重新启动服务
- ReStart();
- break;
- case CodeHead.GET_DISKS:
- //获取本地磁盘
- sendDisks(sender);
- break;
- case CodeHead.GET_DIRECTORY_DETIAL:
- //发送文件夹内的信息(当前路径下的文件和文件夹)
- sendDirectoryDetial(sender,code);
- break;
- case CodeHead.GET_FILE_DETIAL:
- //获取文件详细信息
- sendFileDetial(sender, code);
- break;
- case CodeHead.CONTROL_MOUSE:
- //鼠标控制
- doMouseEvent(code);
- break;
- case CodeHead.CONTROL_KEYBOARD:
- //键盘控制
- doKeyBoardEvent(code);
- break;
- case CodeHead .VERSION:
- //发送版本信息
- sendVersion();
- break;
- default:
- break;
- }
- lbl_Message.Text = code.ToString();
- }
- /// <summary>
- /// 执行鼠标事件
- /// </summary>
- /// <param name="code"></param>
- private void doMouseEvent(Code code)
- {
- MouseEvent mouseCode = code as MouseEvent;
- MouseHook hook = new MouseHook();
- if (mouseCode != null)
- {
- switch (mouseCode.Type)
- {
- case MouseEventType.MouseMove:
- hook.MouseWork(mouseCode);
- break;
- case MouseEventType.MouseClick:
- hook.MouseWork(mouseCode);
- break;
- default:
- hook.MouseWork(mouseCode);
- break;
- }
- }
- }
- /// <summary>
- /// 执行键盘事件
- /// </summary>
- /// <param name="code"></param>
- private void doKeyBoardEvent(Code code)
- {
- KeyBoardEvent keyboardCode = code as KeyBoardEvent;
- KeyBoardHook hook = new KeyBoardHook();
- if (keyboardCode != null)
- {
- switch (keyboardCode.Type)
- {
- case KeyBoardType.Key_Down:
- KeyBoardHook.KeyDown(keyboardCode.KeyCode);
- break;
- case KeyBoardType.Key_Up:
- KeyBoardHook.KeyUp(keyboardCode.KeyCode);
- break;
- default:
- break;
- }
- }
- }
- /// <summary>
- /// 显示通讯内容
- /// </summary>
- /// <param name="code"></param>
- private void displayMessage(Code code)
- {
- DoubleCode contentCode = code as DoubleCode;
- if (contentCode != null)
- {
- switch (code.Head)
- {
- case CodeHead.SPEAK:
- showClientMessage(contentCode.Body);
- break;
- default:
- break;
- }
- }
- }
- /// <summary>
- /// 显示管理员的信息
- /// </summary>
- /// <param name="content"></param>
- private void showClientMessage(string content)
- {
- string IP= "管理员IP";
- string[] record = new string[3] { DateTime.Now.ToString(), IP,"信息:"+ content };
- ListViewItem item = new ListViewItem(record);
- UpdateListView(item);
- Thread showMessageThread = new Thread(new ParameterizedThreadStart(show));
- showMessageThread.Start(content);
- }
- private void show(object content)
- {
- ShowMessage.ShowMessageForm showMessage = new ShowMessage.ShowMessageForm();
- showMessage.Message = "\t 管理员信息\n "+content.ToString();
- showMessage.ShowDialog();
- }
- private delegate void ListViewAddEvent(object Item);
- private void ListViewAddItem(object Item)
- {
- ltv_Log.Items.Add((ListViewItem)Item);
- }
- private void UpdateListView(ListViewItem Item)
- {
- ltv_Log.Invoke(new ListViewAddEvent(ListViewAddItem), new object[] { Item });
- }
- /// <summary>
- /// 发送主机信息
- /// </summary>
- private void sendHostMessage()
- {
- string hostName = RemoteControlLib.Common.Network.GetHostName();
- string hostIP = RemoteControlLib.Common.Network.GetIpAdrress(hostName);
- HostCode code = new HostCode();
- code.Head = CodeHead.HOST_MESSAGE;
- code.Name = hostName;
- code.IP = hostIP;
- mainServer.SendCode(code);
- }
- /// <summary>
- /// 所有服务端已经准备好(发送它们打开的端口到控制端)
- /// </summary>
- private void sendReady()
- {
- PortCode readyCode = new PortCode();
- readyCode.Head = CodeHead.SEND_FILE_READY;
- readyCode.Port = Constant.Port_File;
- mainServer.SendCode(readyCode);
- readyCode.Head = CodeHead.SCREEN_READY;
- readyCode.Port = Constant.Port_Screen;
- mainServer.SendCode(readyCode);
- }
- /// <summary>
- /// 发送服务端版本
- /// </summary>
- private void sendVersion()
- {
- DoubleCode versionCode = new DoubleCode();
- versionCode.Head = CodeHead.VERSION;
- versionCode.Body = version;
- mainServer.SendCode(versionCode);
- }
-
- /// <summary>
- /// 发送本地磁盘信息
- /// </summary>
- /// <param name="sender"></param>
- private void sendDisks(BaseCommunication sender)
- {
- try
- {
- DisksCode diskscode = RemoteControlLib.Common.IO.GetDisks();
- sender.SendCode(diskscode);
- }
- catch
- {
- }
- }
- /// <summary>
- /// 发送文件夹内的信息(当前路径下的文件和文件夹)
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="code"></param>
- private void sendDirectoryDetial(BaseCommunication sender, Code code)
- {
- DoubleCode tempcode = code as DoubleCode;
- if (tempcode != null)
- {
- if (tempcode.Body != "")
- {
- ExplorerCode explorer = new ExplorerCode();
- explorer.Enter(tempcode.Body);
- sender.SendCode(explorer);
- }
- }
- }
- /// <summary>
- /// 发送文件夹内的信息(当前路径下的文件和文件夹)
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="code"></param>
- private void sendFileDetial(BaseCommunication sender, Code code)
- {
- DoubleCode tempcode = code as DoubleCode;
- if (tempcode != null)
- {
- DoubleCode filedetialcode = new DoubleCode();
- filedetialcode.Head = CodeHead.SEND_FILE_DETIAL;
- filedetialcode.Body=RemoteControlLib.Common.IO.GetFileDetial(tempcode.Body);
- sender.SendCode(filedetialcode);
- }
- }
-
- /// <summary>
- /// 显示信息
- /// </summary>
- /// <param name="msg"></param>
- private void displayMessage(string msg)
- {
- lbl_Message.Text = msg;
- }
- }
- }
|