我目前正在一个大学项目中,我们将数据从Arduino发送到C#服务器(已经工作),然后使用TCP将信息传递给运行有Java客户端的Android应用。不幸的是,后者还没有完全起作用。我已经可以在客户端和服务器之间建立连接,并且可以从虚拟电话(Android Studio)向服务器发送消息,但是反之则不行。我对Java完全没有经验,因此非常感谢所有帮助!
我已附上以下代码:
C#服务器:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Generic;
public class SocketServer
{
public static void Main()
{
Parallel.Invoke
(
() => Arduino(),
() => Android()
);
}
public static void Arduino()
{
//Removed since unnecessary for question
}
public static void Android()
{
StreamReader streamReader_App;
NetworkStream networkStream_App;
TcpListener tcpListener_App = new TcpListener(1010);
tcpListener_App.Start();
Console.WriteLine("The Server has started on port 1010");
int msg;
while (true)
{
Socket serverSocket_App = tcpListener_App.AcceptSocket();
try
{
Console.WriteLine("App-Client connected");
networkStream_App = new NetworkStream(serverSocket_App);
streamReader_App = new StreamReader(networkStream_App);
msg = 0;
while (msg == 0)
{
var line_App = streamReader_App.ReadLine();
if (line_App == "CoordRequest")
{
System.Threading.Thread.Sleep(3000);
Console.WriteLine(line_App);
//Send coordinates to App
string message = "Test";
byte[] bytes = Encoding.ASCII.GetBytes(message+"\r\n");
networkStream_App.Write(bytes, 0, bytes.Length);
bytes = new byte[1024];
msg = 1;
}
}
networkStream_App.Close();
serverSocket_App.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
Java客户端(在Android上为启动客户端并接收消息:MainActivity.java
package com.example.tcpclient;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
EditText e1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e1 = (EditText)findViewById(R.id.editText);
Thread myThread = new Thread(new MyServerThread());
myThread.start();
}
class MyServerThread implements Runnable
{
Socket s;
ServerSocket ss;
InputStreamReader isr;
BufferedReader bufferedReader;
Handler h = new Handler();
String message;
@Override
public void run()
{
try
{
ss = new ServerSocket(1010);
while(true)
{
s = ss.accept();
isr = new InputStreamReader(s.getInputStream());
bufferedReader = new BufferedReader(isr);
message = bufferedReader.readLine();
h.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
});
}
}catch(IOException e)
{
e.printStackTrace();
}
}
}
public void send(View v)
{
MessageSend messageSender = new MessageSend();
messageSender.execute(e1.getText().toString());
}
}
Java客户端(在Android上发送消息:MessageSend.java
package com.example.tcpclient;
import android.os.AsyncTask;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MessageSend extends AsyncTask<String,Void,Void>
{
Socket s;
DataOutputStream dos;
PrintWriter pw;
@Override
protected Void doInBackground(String... voids) {
String message = voids[0];
try
{
s = new Socket("192.168.1.10",1010);
pw = new PrintWriter(s.getOutputStream());
pw.write(message);
pw.flush();
pw.close();
s.close();
}catch(IOException e)
{
e.printStackTrace();
}
return null;
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tcpclient">
<uses-permission android:name = "android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
您正在使用套接字来收听Tcp Client,Socket serverSocket_App = tcpListener_App.AcceptSocket();