/*----------------------------------------------------------------
// 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;
}
}
}