/*---------------------------------------------------------------- // 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 { /// /// 被控制端 /// public class Servers { /// /// 主服务端 /// private BaseServer mainServer; /// /// 屏幕服务端 /// private ScreenServer screenServer; /// /// 文件服务端 /// private FileServer fileServer; /// /// 主服务线程 /// private Thread mainThread; /// /// 文件服务线程 /// private Thread fileThread; /// /// 屏幕服务线程 /// private Thread screenThread; /// /// 各种服务端口 /// private int mainPort, screenPort, filePort; /// /// 服务端的程序名 /// private string productName; /// /// 版本 /// private string version; /// /// 服务端的程序名 /// public string ProductName { get { return productName; } set { productName = value; } } /// /// 版本 /// public string Version { get { return version; } set { version = value; } } /// /// 日志列表 /// public ListView ltv_Log; /// /// 显示信息的标签 /// public ToolStripStatusLabel lbl_Message; /// /// 返回Servers(被控制端)的一个实例 /// /// 主服务端口 /// 文件传输端口 /// 屏幕传输端口 public Servers(int mainPort,int filePort,int screenPort) { this.mainPort = mainPort; this.screenPort = screenPort; this.filePort = filePort; this.version = "1.0.0.0"; } /// /// 运行 /// public void Run() { try { OpenMainServer(); OpenScreenServer(); OpenFileServer(); } catch { Close(); MessageBox.Show("通讯端口被占用!"); } } /// /// 关闭所有连接 /// 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(); } /// /// 重新启动服务端 /// private void ReStart() { Close(); Thread.Sleep(1000); Thread NewThread = new Thread(new ThreadStart(Run)); NewThread.Start(); } /// /// 打开主服务端 /// private void OpenMainServer() { mainServer = new BaseServer(mainPort); mainServer.Execute = new ExecuteCodeEvent(mainExecuteCode); mainThread = new Thread(new ThreadStart(mainServer.Run)); mainThread.Start(); } /// /// 打开文件服务端 /// /// private void OpenFileServer() { fileServer = new FileServer(filePort); fileThread = new Thread(new ThreadStart(fileServer.Run)); fileThread.Start(); } /// /// 打开屏幕服务端 /// /// private void OpenScreenServer() { screenServer = new ScreenServer(screenPort); screenThread = new Thread(new ThreadStart(screenServer.Run)); screenThread.Start(); } /// /// 执行指令 /// /// 指令 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(); } /// /// 执行鼠标事件 /// /// 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; } } } /// /// 执行键盘事件 /// /// 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; } } } /// /// 显示通讯内容 /// /// 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; } } } /// /// 显示管理员的信息 /// /// 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 }); } /// /// 发送主机信息 /// 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); } /// /// 所有服务端已经准备好(发送它们打开的端口到控制端) /// 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); } /// /// 发送服务端版本 /// private void sendVersion() { DoubleCode versionCode = new DoubleCode(); versionCode.Head = CodeHead.VERSION; versionCode.Body = version; mainServer.SendCode(versionCode); } /// /// 发送本地磁盘信息 /// /// private void sendDisks(BaseCommunication sender) { try { DisksCode diskscode = RemoteControlLib.Common.IO.GetDisks(); sender.SendCode(diskscode); } catch { } } /// /// 发送文件夹内的信息(当前路径下的文件和文件夹) /// /// /// 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); } } } /// /// 发送文件夹内的信息(当前路径下的文件和文件夹) /// /// /// 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); } } /// /// 显示信息 /// /// private void displayMessage(string msg) { lbl_Message.Text = msg; } } }