C#简单远程控制制作源代码程序以及思路(服务器端)

发布时间:2016-12-11 17:55:47 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C#简单远程控制制作源代码程序以及思路(服务器端)",主要涉及到C#简单远程控制制作源代码程序以及思路(服务器端)方面的内容,对于C#简单远程控制制作源代码程序以及思路(服务器端)感兴趣的同学可以参考一下。

远程控制无非就是在有网络的情况下发送一些操作指令到客户机上, 其实看软件的范围是用来干什么的,网络游戏都可以定义为远程控制软件, 之前不是说腾讯经常扫描别人的硬盘。 所以这里使用socket来简单讲一下做远程控制软件的原理。 服务器端监听一个IP和端口,会用socket的应该都知道。 首先就是建立一个socket服务器,不多说贴代码。 [csharp] view plaincopyprint?    [csharp] view plaincopyprint?public SocketAdmin(string _ip,out Socket _socket, int _port, out Dictionary<string, Socket> _dicSocket)//这是一个构造方法。用来绑定ip和端口并且返回数据           {              ip = _ip;              port = _port;              ServerRun();              _socket=socket ;              _dicSocket=dicOnlineSocket ;            }          private static string ip;          private static int port;          private static Socket socket;          private static void ServerRun()//开始socket服务           {              socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);              IPEndPoint _ipport = new IPEndPoint(IPAddress.Parse(ip), port);              socket.Bind(_ipport);              socket.Listen(50);              Thread _thread = new Thread(WatchAccpt);//使用一个线程来监听与服务器连接上的客户端               _thread.IsBackground = true;              _thread.Start();          }          /// <summary>           /// 所有活动的socket连接           /// </summary>           public static Dictionary<string, Socket> dicOnlineSocket = new Dictionary<string, Socket>();          /// <summary>           /// 用来监听用户的信息           /// </summary>           private static void WatchAccpt()          {              while (socket != null)              {                  Socket _acpSocket = socket.Accept();                  Console.WriteLine("连接:" + _acpSocket.RemoteEndPoint.ToString());                  if (!dicOnlineSocket.ContainsKey(_acpSocket.RemoteEndPoint.ToString()))//如果有新的用户连接上时就会添加到字典中                       dicOnlineSocket.Add(_acpSocket.RemoteEndPoint.ToString(), _acpSocket);              }          }  public SocketAdmin(string _ip,out Socket _socket, int _port, out Dictionary<string, Socket> _dicSocket)//这是一个构造方法。用来绑定ip和端口并且返回数据 { ip = _ip; port = _port; ServerRun(); _socket=socket ; _dicSocket=dicOnlineSocket ; } private static string ip; private static int port; private static Socket socket; private static void ServerRun()//开始socket服务 { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint _ipport = new IPEndPoint(IPAddress.Parse(ip), port); socket.Bind(_ipport); socket.Listen(50); Thread _thread = new Thread(WatchAccpt);//使用一个线程来监听与服务器连接上的客户端 _thread.IsBackground = true; _thread.Start(); } /// <summary> /// 所有活动的socket连接 /// </summary> public static Dictionary<string, Socket> dicOnlineSocket = new Dictionary<string, Socket>(); /// <summary> /// 用来监听用户的信息 /// </summary> private static void WatchAccpt() { while (socket != null) { Socket _acpSocket = socket.Accept(); Console.WriteLine("连接:" + _acpSocket.RemoteEndPoint.ToString()); if (!dicOnlineSocket.ContainsKey(_acpSocket.RemoteEndPoint.ToString()))//如果有新的用户连接上时就会添加到字典中 dicOnlineSocket.Add(_acpSocket.RemoteEndPoint.ToString(), _acpSocket); } } [csharp] view plaincopyprint?    这个方法是自己封装的一个socket 操作类。 如果要使用直接使用下面这句代码:SocketAdmin socketAdmin = new SocketAdmin("192.168.0.200",out _socket, 6160, out dicOnline);由于有2个参数是要传出来的,所以还要先定义2个变量private Socket _socket;private static Dictionary<string, Socket> dicOnline;这是服务器的管理界面[csharp] view plaincopyprint?private void btnStart_Click(object sender, EventArgs e)          {              SocketAdmin socketAdmin = new SocketAdmin("192.168.0.200",out _socket, 6160, out dicOnline);              Thread thread = new Thread(AddLstOnline);              thread.IsBackground = true;              thread.Start();                thread = new Thread(LoopInfoMsg);//循环发送消息的方法               thread.IsBackground = true;              thread.Start();          }  private void btnStart_Click(object sender, EventArgs e) { SocketAdmin socketAdmin = new SocketAdmin("192.168.0.200",out _socket, 6160, out dicOnline); Thread thread = new Thread(AddLstOnline); thread.IsBackground = true; thread.Start(); thread = new Thread(LoopInfoMsg);//循环发送消息的方法 thread.IsBackground = true; thread.Start(); } 在按下监听按钮的时候会启动2个线程。 一个用来在listbox中显示在线人数,代码如下: [csharp] view plaincopyprint? /// <summary>           /// 加入在线人数           /// </summary>           private void AddLstOnline()          {              while (true)              {                  if (lstOnline.Items.Count != dicOnline.Count)//说明有新的用户连上                   {                      lstOnline.Items.Clear();                      foreach (var item in dicOnline.Keys)                      {                          lstOnline.Items.Add(item);                      }                  }              }          }   /// <summary> /// 加入在线人数 /// </summary> private void AddLstOnline() { while (true) { if (lstOnline.Items.Count != dicOnline.Count)//说明有新的用户连上 { lstOnline.Items.Clear(); foreach (var item in dicOnline.Keys) { lstOnline.Items.Add(item); } } } }另一个线程用来发送向客户端发送消息的,也是经过封装的方法,代码有点复杂,如下: [csharp] view plaincopyprint? /// <summary>   /// 发用户的信息,只发个用户本人的   /// </summary>   /// <param name="type1"></param>   /// <param name="type2"></param>   /// <param name="msg"></param>   public void Put_SendInfoToPool(string key, string data,Socket sendSocket)  {      if (PoolInfoMsg == null)      {          PoolInfoMsg = new ArrayList();      }      _tempSocket = sendSocket;      MSGStruct msg = new MSGStruct();      msg.key = key;      msg.json = data;      string json = JsonMapper.ToJson(msg);      byte[] byteArr = System.Text.Encoding.UTF8.GetBytes(json);      PoolInfoMsg.Add(byteArr);  }  private Socket _tempSocket;  private ArrayList PoolInfoMsg;  public void LoopInfoMsg()  {      while (_socket != null)      {          if (PoolInfoMsg != null && PoolInfoMsg.Count > 0)//表示有消息           {              _tempSocket.Send((byte[])PoolInfoMsg[0]);                PoolInfoMsg.RemoveAt(0);//移除已发的消息           }          Thread.Sleep(20);        }  }   /// <summary> /// 发用户的信息,只发个用户本人的 /// </summary> /// <param name="type1"></param> /// <param name="type2"></param> /// <param name="msg"></param> public void Put_SendInfoToPool(string key, string data,Socket sendSocket) { if (PoolInfoMsg == null) { PoolInfoMsg = new ArrayList(); } _tempSocket = sendSocket; MSGStruct msg = new MSGStruct(); msg.key = key; msg.json = data; string json = JsonMapper.ToJson(msg); byte[] byteArr = System.Text.Encoding.UTF8.GetBytes(json); PoolInfoMsg.Add(byteArr); } private Socket _tempSocket; private ArrayList PoolInfoMsg; public void LoopInfoMsg() { while (_socket != null) { if (PoolInfoMsg != null && PoolInfoMsg.Count > 0)//表示有消息 { _tempSocket.Send((byte[])PoolInfoMsg[0]); PoolInfoMsg.RemoveAt(0);//移除已发的消息 } Thread.Sleep(20); } } 这里发送消息使用的是json发送字符串。 [csharp] view plaincopyprint? /// <summary>           /// 消息类 键是id,data是json字符串           /// </summary>           public class MSGStruct          {              public string key;              public string json;          }   /// <summary> /// 消息类 键是id,data是json字符串 /// </summary> public class MSGStruct { public string key; public string json; } 消息会有一个类,定义建和发送的值。 下面看发送消息按钮的实现代码: [csharp] view plaincopyprint? private void btnSendMsg_Click(object sender, EventArgs e)          {              if (lstOnline.SelectedItem!=null)//如果已经选中了就准备发消息                   Put_SendInfoToPool("text", txtString.Text, dicOnline[lstOnline.SelectedItem.ToString()]);              else                  MessageBox.Show("请选择接受对象");          }   private void btnSendMsg_Click(object sender, EventArgs e) { if (lstOnline.SelectedItem!=null)//如果已经选中了就准备发消息 Put_SendInfoToPool("text", txtString.Text, dicOnline[lstOnline.SelectedItem.ToString()]); else MessageBox.Show("请选择接受对象"); }是不是经过封装以后就很简单了。这样就可以把消息发送到客户端了。 另一个简单的功能就是让客户端代码来不定期的打开网页。 首先要定义一个Json对象用来发送消息。 [csharp] view plaincopyprint? public class OpenClass  {      /// <summary>       /// 要打开的网站       /// </summary>       public string openUrl;      /// <summary>       /// 间隔的时间       /// </summary>       public string stopTime;      /// <summary>       /// 是否开始,1表示开始,0表示关闭       /// </summary>       public int IsStart;  }   public class OpenClass { /// <summary> /// 要打开的网站 /// </summary> public string openUrl; /// <summary> /// 间隔的时间 /// </summary> public string stopTime; /// <summary> /// 是否开始,1表示开始,0表示关闭 /// </summary> public int IsStart; } 然后用一个方法来给他赋值 [csharp] view plaincopyprint? private void SendOpenUrl(string url,string time,int start)          {              OpenClass open = new OpenClass();              open.openUrl = url;              open.stopTime = time;              open.IsStart = start;              string josn=JsonMapper.ToJson(open);              if (lstOnline.SelectedItem != null)//如果已经选中了就准备发消息                   Put_SendInfoToPool("openUrl", josn, dicOnline[lstOnline.SelectedItem.ToString()]);              else                  MessageBox.Show("请选择接受对象");          }   private void SendOpenUrl(string url,string time,int start) { OpenClass open = new OpenClass(); open.openUrl = url; open.stopTime = time; open.IsStart = start; string josn=JsonMapper.ToJson(open); if (lstOnline.SelectedItem != null)//如果已经选中了就准备发消息 Put_SendInfoToPool("openUrl", josn, dicOnline[lstOnline.SelectedItem.ToString()]); else MessageBox.Show("请选择接受对象"); } 好写好2个方法以后,要发消息到客户端,就是实现开始和停止2个按钮的功能。 首先是开始按钮的代码: [csharp] view plaincopyprint? private void btnOpenStart_Click(object sender, EventArgs e)          {              SendOpenUrl(txtUrl.Text,txtTime.Text, 1);          }   private void btnOpenStart_Click(object sender, EventArgs e) { SendOpenUrl(txtUrl.Text,txtTime.Text, 1); }然后是停止按钮的代码 [csharp] view plaincopyprint? private void btnOpenStop_Click(object sender, EventArgs e)  {      SendOpenUrl(txtUrl.Text, txtTime.Text, 0);  }   private void btnOpenStop_Click(object sender, EventArgs e) { SendOpenUrl(txtUrl.Text, txtTime.Text, 0); } 一些规则已经定义好以后操作起来就非常简单了。 服务器就简单实现了2个功能,如果需要什么其他的功能只需要定义好一个消息结构,然后在写实现的方法,整个模块已经可以完成了。

上一篇:Mac os 进行Android开发笔记(1)
下一篇:jSP九种内置对象

相关文章

相关评论