概述
远程控制无非就是在有网络的情况下发送一些操作指令到客户机上,
其实看软件的范围是用来干什么的,网络游戏都可以定义为远程控制软件,
之前不是说腾讯经常扫描别人的硬盘。
所以这里使用socket来简单讲一下做远程控制软件的原理。
服务器端监听一个IP和端口,会用socket的应该都知道。
首先就是建立一个socket服务器,不多说贴代码。
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);
}
}
这个方法是自己封装的一个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;
这是服务器的管理界面
- 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中显示在线人数,代码如下:
- /// <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);
}
}
}
}
另一个线程用来发送向客户端发送消息的,也是经过封装的方法,代码有点复杂,如下:
- /// <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发送字符串。
- /// <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;
}
消息会有一个类,定义建和发送的值。
下面看发送消息按钮的实现代码:
- 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对象用来发送消息。
- 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;
}
然后用一个方法来给他赋值
- 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个按钮的功能。
首先是开始按钮的代码:
- 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);
}
然后是停止按钮的代码
- 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个功能,如果需要什么其他的功能只需要定义好一个消息结构,然后在写实现的方法,整个模块已经可以完成了。
最后
以上就是小巧雨为你收集整理的C#简单远程控制制作源代码程序以及思路(服务器端)的全部内容,希望文章能够帮你解决C#简单远程控制制作源代码程序以及思路(服务器端)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复