最近在做一个远程控制,远程桌面控制,鼠标和键盘控制和文件传送下载都已经做好了。但这个远程控制做得有点缺点,我现在采用的是最简单的做法,一个client(控制端)一个server(被控制端)。
如:client(控制端)
        private Socket socket;
        private TcpListener listener;        listener = new TcpListener(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], 5761);
        listener.Start();
        socket = listener.AcceptSocket();
     server(被控制端)
            newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            newSocket.Connect("192.168.1.168", 5761);
            newSocket.Send(myData);
这种做法就是直接在server(被控制端)访问client(控制端,固定IP"192.168.1.168"),然后不断地发送图片,client(控制端,"192.168.1.168")收到图片数据后还原成图片,但这种做法就死死地限定了IP只能在"192.168.1.168"这台机器上控制server(被控制端)了,有没有什么办法让我可以在其它机器也能对server(被控制端)进行控制的?并且可不可以做到多个Client(控制端)都可以获得来自Server(被控制端)的连接请求?有没啊位大神在这方面比较有经验的麻烦指教下,或者给个简单的例子学习学习,谢谢。

解决方案 »

  1.   

    被控制端增加个配置文件,里面记录 IP 地址列表,启动后读取配置文件,取得 IP 地址列表逐个连接发送图片
      

  2.   

    你server要有一个用户列表把(长连接)你发送时遍历发送(推),或者客户端跟你要(拉)
      

  3.   

    可以分享下你的代码么,我最近也正在研究你这个....
    邮箱:[email protected]
      

  4.   

    嗯,avphoenixi和bdmh的想法我有想过,但我想做成那种由Server(被控制端)向一个固定IP的机器(简称代理服务器吧)发送请求(这里发送的仅仅是一个连接的请求(包含了IP和端口的信息),但并没有进行图片数据之类的发送),然后Client(控制端)运行后就向代理服务器取得在线Server(被控制端)的请求(IP和端口),意思即是说能不能做个代理服务器之类的来转发来自Server(被控制端)的请求到Client(控制端)。
      

  5.   

    代理服务器开启两项监听,一项接收Client的请求,将Client发送的监听地址端口记录在本地,另一项接收Server的请求,将本地记录的Client地址端口列表回复Server,Server再直接向Client发送图片
      

  6.   

    为什么不直接调用系统的远程桌面组件?
    Visual Studio里面工具箱选择项,选择COM组件,里面找到Microsoft RDP Client Control
      

  7.   

    这个做过,但这个不太符合我所需要的,第一VS的组件远程过去控制被控制端时相当于新开一个用户进去的,所以看到的并不是控制端用户正在操作的界面。第二,VS的这个功能其实就相当于调用系统的mstsc.msc功能,所以我必须得知道用户的IP和用户名和密码,但用户的IP是有可能变的,而且我也并不清楚用户的的用户名和密码。但不得不佩服微软的这个Mstsc.msc做的相当好,速度很快。
      

  8.   

    我目前所做的可以开多个Server(被控制端),但开多个Client(控制端)并不行,因为Server(被控制端)只是向固定的IP(比如192.168.1.168)发送连接的请求,当我在其它的电脑(非192.168.1.168IP)运行Client(控制端)的时候,这台电脑就肯定监听不到来自Server(被控制端)的连接请求了
      

  9.   

    Client按一定的格式将本地监听的端口发给代理服务器,代理服务器读取这个端口再加上请求者的IP保存到一个列表里,不要重复,代理服务器接收到Server的请求后读取那个列表,按一定格式回复给Server,这说的够直白了,代码得根据你的程序来写
      

  10.   

    为什么不让server(被控制端)new TcpListener,一旦连上你想让谁主动谁被动还不是程序的事。
    或者server(被控制端)一个TcpListener,多个TcpClient,初次连接都通过TcpListener。
      

  11.   

    你意思是说Server(被控制端)new TcpListener来监听来自Client的请求?
      

  12.   

    你一开始的设计思路就错了
    怎么可能让 server 访问 client,然后主动发图片。server是干什么的,是接受处理请求。你主动发是个什么意思?1.server开一个监听端口,接到命令再发送图片。
    2.client访问server时,server就可以得到client的ip,做一个传输类,里边是一个TCP directory,key是ip
    3.根据命令的ip到传输类里找到tcp directory里对应的那个tcp,没有就添加个新的,有就直接用,以免重复创建造成多次握手
    4.server找到与client交互的tcp时,使用它与client交互,至于发图片还是什么的,就随便了。
    补充,貌似client还可以控制server的鼠标键盘是吧?
    在传输类里增加一条控制tcp,记录当前正在控制server的ip,如果其他client要控制server还可以选择强制中断上一个用户?或者说,通知正在操作server的用户有人尝试操作server是否将控制权转移等等,这样更灵活。而且这条tcp还可以做接受键盘鼠标指令的。这样一来起码你的程序大概设计思路就对了。
      

  13.   

    哦,补充,这样的设计,可以多个client同时与server交互。你刚才那种设计只能单对单。
    就算是一对多,也是必须所有client全部开启,或者人家没有发送请求需要数据,你就强制给人家发了。
      

  14.   

    楼主把客户端IP保存在一个列表里面,发送图片的时候,给在IP地址列表中的每一台机器都发送,这样就可以实现多个client连接同一台server了,而且在server端是可以得到client的ip信息的,所以楼主不用写死client的ip是192.168.1.168,应该用socket.remoteAddress来获取
      

  15.   

    server开一个监听端口,接到命令再发送图片。
    你這個前提得是我Client(控制端)知道了Server(被控制端)的IP之後才會成立的,如果我並不知道Server(被控制端)的IP的話這失去了意義了。
      

  16.   


    你见过server的ip是一直变的?
    我听过client会变,没听过server会变。
    你只要在client增加server ip指定,然后保存以后直接调用就可以了,他只需要设置一次,或者server的ip修改了他才设置。 内网的server ip用自动获取,我就表示你们的设计真的让人无语了。如果是外网,绑定个域名可以么?不就也固定ip了?你们的设计有问题你不听,server要起到server的作用,如果你反过来搞,那就把你所谓的“server”和“client”的词给对方换一下。不要 client 也叫 server,server反而叫client。
    server是接收命令的,不是主动访问客户端发送命令的。这种情况不是不存在,而是你的这个功能这么设计本身就是错的。言归于此,不再作解释。
      

  17.   

    唉,真想叫你大哥,怎麼就不看看我的問題呢。我所做的就是你所指的“Server”(server固定IP也好,域名綁定的也好)監聽來自“Client”的請求之後進行通迅的,這個誰都知道,只不過是我把你所謂的"server"改一個名稱叫"client"而已,問題裏都已經描述得很清楚了,難道改個叫法就叫設計有問題?
      

  18.   

    可以從 內網1 <--> 外網 <--> 內網2 么?
      

  19.   


    矛盾么?你说server就是client,client就是server,反着叫而已。
    那这设计没有问题会出现这种情况?不跟你纠结设计的问题了。反正我说了我的看法,你不做也没关系,我又没赚你钱。你又不给我发工资,不用跟你争论。等你发现问题的时候你自然会改。如果你做的是个毕业设计,我没话说,糊弄过去就行。
    如果你做的是个产品,你不改我都佩服你!
    没见过这么设计产品的。
      

  20.   

    大言不慚,有空多看看別人寫的東西,理解理解什麼叫server和client,server和client也不是隨便叫的。
      

  21.   

    矛盾么?你说server就是client,client就是server,反着叫而已。
    那这设计没有问题会出现这种情况?不跟你纠结设计的问题了。反正我说了我的看法,你不做也没关系,我又没赚你钱。你又不给我发工资,不用跟你争论。等你发现问题的时候你自然会改。如果你做的是个毕业设计,我没话说,糊弄过去就行。
    如果你做的是个产品,你不改我都佩服你!
    没见过这么设计产品的。
    其实并不矛盾吧,人家楼主之所以叫server,只不过是因为server端只做命令的处理和数据的发送,server端并没有实际的界面操作,而实际的界面操作都是在client端,也就是楼主所说的控制端了,网上很多源码都是这样啊,难道是我们的设计都有问题?
      

  22.   

    我自己認為我沒有將這個東西賣出去的水平,我本來就是想做著玩學技術的,玩過logemin和teamviewr你就知道,沒有免殺、沒有內網穿透這些技術你根本賣不出去。
      

  23.   


    我只是告诉你,本身这么设计就有问题。
    服务端的职责要搞清楚,没必要跟你较劲能不能卖。
    如果你只是研究socket能不能通信,通信了能不能控制电脑,那你成功了。
      

  24.   

    你认真看看?或者用下你的大脑想想先?我都看明白了,很明显他的意思就是Server(人家称作受控端而已)向Client(控制端)发送请求之后才通信的。他也根本就没有想过要知道所有Server(人家是称做用户端)端的IP,也根本就不需要知道,因为他本来就是所有Server(人家是称做用户端)发固定IP的Client(192.168.1.168人家叫控制端)发送请求的。你确定你会?不装会死?
      

  25.   

    [Quote=引用 38 楼  的回复:]
    麻烦你仔细看问题,没看明白别乱回答。
    他要让服务端主动发送请求给客户端,真叫你给败了。
    一个远程控制要让服务端主动给客户端发数据。
    而且还要让服务端知道所有客户端的IP, 客户端不需要知道服务端的。
    你仔细看了么,你确定么,你会这么设计?
    还很多源码都这样。可笑。如果你脑子还想不明白,我帮你分析下他的代码吧:
    client(控制端) //这里看清楚了吧,client端
      private Socket socket;
      private TcpListener listener;  listener = new TcpListener(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], 5761);
      listener.Start();
      socket = listener.AcceptSocket();//client端一直监听被控制端的请求,所以就这一句就已经明白他的意思了。  server(被控制端)//这里人家叫server,而以你的意思这里就非得叫client
      newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      newSocket.Connect("192.168.1.168", 5761);//这里就是向他的client请求连接了,明白?
      newSocket.Send(myData);
    所以他说得够直白了,都不知道你是什么鸟程序员。
      

  26.   

    結了,感謝avphoenixi和bdmh的想法,學到不少,特別是love_99,dodducs的建議會考慮一下,不過還是h744379120比較懂我的意思。
      

  27.   


    连个Linq查询都不会的人,别跟我谈设计好么。
    你工作多久?半年都没到?还是根本就是个学生。等你真的学会设计了以后再回头看看这个问题,你会发现你的回答多么可笑。
      

  28.   

    我不懂的就向人家学习,不像有些人不装总会死,就算我是个学生都比你强多了,难道你工作五年了?还是十年了?那就怪了,居然连楼主的意思都还没看不明白,就在这里说人家就不是那不是,还说人家设计有问题,肯定SB一个,都叫你看清楚问题再放屁行吗?不要说这说那OK?看来你并不适合当程序员啊,还是你压根不是程序员?
      

  29.   

    dodducs,又一个坑爹的设计大师,硬是把人家的意思扭曲来说
      

  30.   

    21正是年轻有为的时候,其实你老啦,设计大师!Server和Client都不懂,还有什么用?