通过局域网连接Android应用程序到PC应用程序
本文关键字:应用程序 PC Android 连接 局域网 | 更新日期: 2023-09-27 18:15:58
我通过Android设备上的视频游戏环境(Unity,基本上是一个c#库)运行一个应用程序。我希望这个应用程序响应命令从我的PC(最好运行Windows 8,但可以是Linux:Ubuntu如果更容易)。设备和PC在同一个局域网中,但没有通过物理线缆连接。我需要设备在命令发出后0.5秒内响应来自PC的命令。
问题:在我的PC和我的设备之间建立这种连接的最简单(概念上和实际上)的方法是什么?
示例场景:我正在Android手机上运行一款游戏,屏幕上有蜘蛛在爬行。当我按下电脑上的空格键时,我希望所有的蜘蛛都被赶走。当前解决方案:创建一个ruby-on-rails网站&数据库。当在PC上输入命令时,数据库将更新为该命令。每隔0.5秒,设备检查数据库上的时间戳并提取任何新命令。这个解决方案是次优的,因为我不懂ruby(我愿意学习它,但我想要一个更简单的解决方案)。
我应该使用c#套接字吗?
我喜欢一些简单的代码,例如,打开我的PC和我的设备之间的直接连接,允许我发送字节流(例如,我的PC可以发送字符串"空格键被按下")。
我对网络知之甚少,希望能得到简单的解释。
与pc和手机通信的最佳方式是一个简单的插座。在一端的特定端口号上创建服务器套接字,并从另一端连接它。非常快(甚至不到0.1秒)
例子:
服务器(移动端)
public class Provider{
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Provider(){}
void run()
{
try{
//1. creating a server socket
providerSocket = new ServerSocket(2004, 10);
//2. Wait for connection
System.out.println("Waiting for connection");
connection = providerSocket.accept();
System.out.println("Connection received from " + connection.getInetAddress().getHostName());
//3. get Input and Output streams
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
sendMessage("Connection successful");
//4. The two parts communicate via the input and output streams
do{
try{
message = (String)in.readObject();
System.out.println("client>" + message);
if (message.equals("bye"))
sendMessage("bye");
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
}
}while(!message.equals("bye"));
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
providerSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
System.out.println("server>" + msg);
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Provider server = new Provider();
while(true){
server.run();
}
}
}
和客户端(PC - c#)
class ClientThread implements Runnable
{
public void run()
{
try
{
Socket socket = new Socket(serverIpAddress, serverPort);
socket.setSoTimeout(5000);
while (true)
{
try
{
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Log.d("Nicklas", "Out it goes");
out.println(Command);
if (Command == "CMD:GetOptions<EOF>")
{
Log.d("Nicklas", "Getting options");
try
{
Log.d("Nicklas", "Line 1");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.d("Nicklas", "Line 2");
String answer = in.readLine();
Log.d("Nicklas", "answerswer = " + answer );
}
catch (Exception ee)
{
Log.d("Nicklasasasas", ee.toString());
}
}
break;
}
catch (Exception e)
{
Log.d("Nicklas", "CAE = " + e.toString());
break;
}
}
socket.close();
}
catch (ConnectException ee)
{
Log.d("Nicklas", "Kunne ikke forbinde");
}
catch (Exception e)
{
Log.d("Nicklasssssss", e.toString());
}
}
}