将来自蓝牙连接的传入数据用于特定对象? C#Windows Form应用程序和Java Android应用程序 - java

首先发布在这里。我试图寻找一个我有但没有运气的问题,所以我想我自己问这个问题。

我正在研究2个程序。 Java中的Android应用程序和Windows中的C#Windows Form应用程序。它们都是简单的计分计算器,用于跟踪2位玩家的分数。

这两个程序的目标是使用蓝牙连接在彼此之间来回发送数据,以便它们被“同步”。 Android应用程序是客户端,c#应用程序是服务器(32feet库)。

使用Android上的Bluetooth Chat示例以及我在VS中编写的一些代码,我设法使这2个程序相互连接,收发数据,太好了!

但是现在我的主要目标是,我需要找到一种方法来获取来自Android应用程序的传入数据,并更改Windows应用程序上的适当标签/文本。

因此,例如:

在Windows应用程序上,有2个标签:一个用于Player1,一个用于Player2,都说“ 10”。
在Android App上,我有2个按钮分别从Player1或Player2的分数中减去。
在android应用程序上,如果我触摸从Player1减去(-)1的按钮,它将是9。
然后,我希望播放器2的得分相同。

这是我可以描述的最好的目标,我想知道是否有可能,如果可以,请指明正确的方向。

这是到目前为止我提供的一些代码:

C#Windows窗体应用程序:

private void button1_Click(object sender, EventArgs e)
        {
            if (serverStarted == true)
            {
                updateUI("Server already started");
                return;
            }
            if (radioButton1.Checked)
            {
                connectAsClient();
            }
            else
            {
                connectAsServer();
            }
        }

        private void connectAsServer()
        {
            Thread bluetoothServerThread = new Thread(new ThreadStart(ServerConnectThread)); //creates new thread and runs "ServerConnectThread"
            bluetoothServerThread.Start();
        }

        private void connectAsClient()
        {
            throw new NotImplementedException();
        }

        Guid mUUID = new Guid("fa87c0d0-afac-11de-8a39-0800200c9a66");
        bool serverStarted = false;


        public void ServerConnectThread()
        {
            serverStarted = true;
            updateUI("Server started, waiting for client");
            BluetoothListener blueListener = new BluetoothListener(mUUID);
            blueListener.Start();
            BluetoothClient conn = blueListener.AcceptBluetoothClient();
            updateUI("Client has connected");

            Stream mStream = conn.GetStream();

            while (true)
            {

                try
                {
                    //handle server connection
                    byte[] received = new byte[1024];
                    mStream.Read(received, 0, received.Length);
                    updateUI("Received: " + Encoding.ASCII.GetString(received));
                    byte[] sent = Encoding.ASCII.GetBytes("hello world");
                    mStream.Write(sent, 0, sent.Length);
                }
                catch (IOException exception)
                {
                    updateUI("Client disconnected");
                }
            }
        }

        private void updateUI(string message)
        {
            Func<int> del = delegate ()
            {
                textBox1.AppendText(message + Environment.NewLine);
                return 0;

            };
            Invoke(del);
        }

    }

Android应用程序(来自蓝牙聊天示例的片段-我认为这是唯一相关的部分):

    /**
     * Sends a message.
     *
     * @param message A string of text to send.
     */
    private void sendMessage(String message) {
        // Check that we're actually connected before trying anything
        if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED) {
            Toast.makeText(getActivity(), R.string.not_connected, Toast.LENGTH_SHORT).show();
            return;
        }

        // Check that there's actually something to send
        if (message.length() > 0) {
            // Get the message bytes and tell the BluetoothChatService to write
            byte[] send = message.getBytes();
            mChatService.write(send);

            // Reset out string buffer to zero and clear the edit text field
            mOutStringBuffer.setLength(0);
            mOutEditText.setText(mOutStringBuffer);
        }
    }

参考方案

您将需要将客户端添加到流列表中以供参考,并将每个客户端的分数存储在列表中,然后将来自每个客户端的数据发送到其余客户端
所以从服务器上您基本上会有这样的事情

List<Stream> clients=new List<Stream>();
List<String> client_scores=new List<String>();
    public void ServerConnectThread()
    {
        serverStarted = true;
        updateUI("Server started, waiting for client");
        BluetoothListener blueListener = new BluetoothListener(mUUID);
        blueListener.Start();
        BluetoothClient conn = blueListener.AcceptBluetoothClient();
        updateUI("Client has connected");

        Stream mStream = conn.GetStream();
    clients.add(mStream);
    client_scores.add(new Random().Next()+"");
    int index_cnt = clients.IndexOf(mStream);

        while (true)
        {

            try
            {
                //handle server connection
                byte[] received = new byte[1024];
                mStream.Read(received, 0, received.Length);

                updateUI("Received: " + Encoding.ASCII.GetString(received));
                client_scores[client_scores.FindIndex(ind=>ind.Equals(index_cnt))]       =  Encoding.ASCII.GetString(received);
                byte[] sent = Encoding.ASCII.GetBytes("hello world");
                mStream.Write(sent, 0, sent.Length);
                foreach(Stream str in clients)
                {
                 byte[] my_score = Encoding.ASCII.GetBytes(clients.ToArray()[index_cnt]+"");
                str.Write(my_score, 0, my_score.Length);
                }
            }
            catch (IOException exception)
            {
                updateUI("Client disconnected");
            }
        }
    }

然后,您可以序列化以某种json格式发送的数据,以便舒适地发送多个数据字段,例如:

{
  "data type": "score",
  "source_id": "client_unique_id",
  "data": "200"
}

在显示方面,只需获取(在我们的示例中为source_id和data)的值并显示在标签上

在Windows中使用Java将焦点设置为非Java应用程序 - java

我想编写一个为Windows中的非Java应用程序创建输入的应用程序。使用Robot类,很容易生成输入,但是我需要将焦点设置到另一个应用程序的文本框中,然后在该文本框中输入文本。不用担心我不是在尝试写恶意的东西,我只是想使用Java来“扩展”用Delphi编写的旧应用程序。 参考方案 CMDOW是一个命令行实用程序,可让您执行各种窗口操作,例如激活/停用,列…

在硬件级别模拟按键-Windows - java

我正在寻找一种语言或库,以使我可以尽可能地模拟按键,而无需实际按下按键。(我对按键级别的具体衡量标准是,当我的计算机已经在运行按键侦听器(例如MouseKey和StickyKeys)时,它是否会产生与物理按键相同的输出。)我已经尝试了许多模拟按键的方法。Java AWT库,Java win32api,python win32com sendKeys,pyth…

Java File.delete()有时会留下无法访问的文件(Windows) - java

我试图以编程方式从正在运行的(!)系统中清除日志文件,该系统由数个Java和非Java服务器组成。我使用了Java的File.delete()操作,它通常可以正常工作。对于当前未删除的正在使用的日志文件,我也非常满意,因此只要File.delete()返回false时,我就将其记录为警告。但是,在目前仍由NON-Java应用程序(Postgres,Apach…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…