首先发布在这里。我试图寻找一个我有但没有运气的问题,所以我想我自己问这个问题。
我正在研究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()在…