zoukankan      html  css  js  c++  java
  • Socket远程桌面

    自建Socket转发,使用远程桌面(mstsc)连接家中电脑

     

    网络结构图如下:

    网络示意图

    开题先放图,一切全靠编哈哈。

    进入正题!

    如图所示,我们需要一个公网服务器,利用公网服务器将内网的数据进行转发,从而实现两个内网服务器的通讯。没错,这不是p2p,原本想做成p2p,因为有点难度,所以先弄一个tcp数据包转发,后面再来打洞进行p2p连接。

    开发环境

    VS2017 + asp net core2.1 +  .net framework 4.5

    整个过程是如何实现的呢?

    1.被控客户端启动,发送被控端名称,例如:Home

    2.服务器接收到被控端的数据,将Home记录,并将Home绑定到当前Tcp连接

    3.主控端启动,发送要连接的“被控端服务”名称,例如:Home

    4.服务端接收到主控端的请求,查询Home对应的Tcp连接

    5.将从主控端来的数据转发到被控端,将被控端来的数据转发到主控端

    代码在哪?

    放到github上了:https://github.com/bobowire/Wireboy.Socket.P2PService

    在实现的过程中遇到什么问题了?

    1.由于windows锁屏后,Console.WriteLine方法会进行无限期等待,导致程序卡住不动。

    解决办法:在运行后,将所有的Console.WriteLine方法全部注释掉了。

    2.在连接一次之后,再次连接会因为接收函数的超时时间太长,导致后面连接失败

    解决办法:增加守护线程,在进行数据传输后,开启守护线程,一旦数据传输发生超时,启动新的tcp连接进行通讯。为什么不用自带的超时?嗯,那时候没想到这个东西。

    讲解一下代码吧?

    代码很简单,主要是用的TcpClient和TcpListener两个类,利用Dictionary绑定Tcp连接与服务名称,所以只允许一台电脑连接被控端。如此一来,被控端的断线重连对数据的转发影响就不大了。

    TcpListener类用于监听本地端口。

    TcpClient类用于转发数据。

    怎么使用?

    请查看项目MD文件:https://github.com/bobowire/Wireboy.Socket.P2PService

    运行效果图

     
    分类: C#
  • 相关阅读:
    Python中使用MongoEngine
    Python中MongoDB使用
    JAVA 日期相关API (JDK 8 新增)
    JAVA 日期相关API(JDK 8 之前)
    StringBuffer 和StringBuilder
    String 类型转换
    String类常用方法
    JAVA String类
    关于线程锁的释放和保留
    java线程同步--使用线程池
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/10414701.html
Copyright © 2011-2022 走看看