java - 通过蓝牙 RDP

标签 java android sockets bluetooth rdp

这是一个研发项目。通过蓝牙将 Windows PC 的桌面传输到手机。我成功地将桌面以 720p 流式传输到我的 Android 手机,但问题是我无法进行直播。通过蓝牙传输的编码和数据需要几毫秒,所以它不是实时的。所以我做了什么,为此我选择了 RDP。由于 RDP 仅适用于 LAN。我没有 PAN 的资料。我写了一个代理,它只通过蓝牙将 RDP 数据包从本地主机路由到我的计算机。在计算机端有另一个程序正在运行,它从蓝牙获取数据并将此数据发送到本地主机端口 3389。现在我面临的问题是,随着连接的启动,套接字会自行关闭。程序最初只读取80或45个字节,然后出现异常“Socket Closed”。我的问题是,RDP 是打开和关闭 session 的套接字,还是第一次连接然后使用该套接字。因为我是这个 RDP 的新手。建议我一些关于 RDP 的话题。非常感谢任何帮助。

问候 月仔

更新:

我正在使用以下代码读取和写入蓝牙和套接字。

  class ReadWrite implements Runnable {

    private String name;

    private Thread thread;
    private InputStream is;
    private OutputStream os;

    private volatile boolean start = false;

    public ReadWrite(String name, InputStream is, OutputStream os) {
        this.name = name;
        this.is = is;
        this.os = os;
        thread = new Thread(this);
    }

    public void startThread() {
        start = true;
        thread.start();
    }

    public void stopThread() {
        start = false;
        try {
            if (is != null) {
                is.close();
            }

            if (os != null) {
                os.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        System.out.println(name + " ReadWrite Started");

        byte[] buffer = new byte[8092];
        int read;

        while (start) {
            try {
                read = is.read(buffer);
                System.out.println(name + " Read: " + read);
                if (read > 0) {
                    os.write(buffer, 0, read);
                    os.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }

        System.out.println(name + " ReadWrite Stopped");
    }
}

我正在启动此线程的 2 个实例,例如:

  ReadWrite bt2net = new ReadWrite("bt2net", btis, netos);
  ReadWrite net2bt = new ReadWrite("net2bt", netis, btos);
  bt2net.startThread();
  net2bt.startThread();

其中 btisnetosnetisbtosInputStream输出流。这个类在Android和PC端都有使用。 PC 端以 -1 的读取长度运行,而 Android 端给我这个异常:

  java.net.SocketException: Socket closed
  java.io.IOException: bt socket closed, read return: -1

我不知道这是怎么回事,为什么会这样。请说明 RDP 低级别,因为我没有找到任何有用的信息。

最佳答案

是的,看起来 RDP 在连接时会打开和关闭套接字。我刚刚对从 Windows Vista 计算机到 Windows Server 2003 R2 服务器的 RDP 连接进行了数据包捕获,并且有两个 TCP 流。第一个 TCP 流由 19 个字节组成,然后以另一种方式返回 19 个字节,类似于您的描述。一秒钟后,建立另一个 TCP 连接,并持续 session 的长度。

祝你的项目好运!

关于java - 通过蓝牙 RDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25480915/

相关文章:

c++ - 如何将MAC地址转换为对应的IP地址?

java - 如何使用 Google 的 Gson API 正确反序列化 JSON?

java - 我可以将额外的 Spring 配置文件动态加载到现有的 WebApplicationContext 中吗?

android - dex文件的endian_tag

android - 将多个 Flash 动画导出为 Android APK

java - 将消息从 C++ 服务器发送到 Java 客户端

java - 如何模拟注入(inject)的依赖

java - UTF-8编码和http参数

java - 设置继续按钮以恢复之前的 Activity

python - 在 Python 中使用 getattr 调用函数