我正在创建一个应用程序,它将监视特定 Android 设备(客户端)中的移动并将此类实例报告给另一个 Android 设备(服务器)。同样,在特定条件下,客户端会拍照并将图像传输到服务器。
我正在使用 WiFi 直接设置两个设备之间的连接。之后,我将按照 WiFi Direct 演示中的说明使用套接字连接。我使用端口 8988 发送运动传感器事件,我使用端口 8987 发送图像捕获。
在服务器端,我使用同一个异步任务的两个不同实例,serversocket 连接到不同的端口来监听传入的消息。只要只发送运动传感器事件,一切都会正常工作。第一个图像捕获也被正确发送/接收。但是,之后服务器不会收到任何其他消息。我尝试使用两个不同的 Async Task 类来避免同一类的两个实例,但效果不佳。我还尝试将一个作为异步任务,另一个作为意图服务,但即使这样也行不通。
这是我用来将消息发送到服务器的 IntentService。
public class MessageSender extends IntentService {
public static final String EXTRAS_TIMEOUT = "timeout";
public static final String EXTRAS_ADDRESS = "go_host";
public static final String EXTRAS_PORT = "go_port";
public static final String EXTRAS_DATA = "data";
private Handler handler;
public MessageSender(String name) {
super(name);
}
public MessageSender() {
super("MessageTransferService");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler = new Handler();
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
String host = intent.getExtras().getString(EXTRAS_ADDRESS);
Socket socket = new Socket();
int port = intent.getExtras().getInt(EXTRAS_PORT);
byte[] data = intent.getExtras().getByteArray(EXTRAS_DATA);
int timeout = intent.getExtras().getInt(EXTRAS_TIMEOUT);
try {
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), timeout);
OutputStream stream = socket.getOutputStream();
stream.write(data);
} catch (final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Exception has occurred: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
} finally {
if (socket != null) {
if (socket.isConnected()) {
try {
socket.close();
/*handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Socket Connection closed now..",
Toast.LENGTH_SHORT).show();
}
});*/
} catch (IOException e) {
// Give up
e.printStackTrace();
}
}
}
}
}
}
这是服务器上的异步任务,它在两个端口(8987 和 8988)上启动侦听器,以接收运动传感器事件和图像的信息。
public class MessageReceiver extends AsyncTask<Void, Void, String> {
private Context context;
private int port;
private Bitmap mBitmap;
public MessageReceiver(Context context, int port) {
this.context = context;
this.port = port;
}
@Override
protected String doInBackground(Void... params) {
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket client = serverSocket.accept();
InputStream inputstream = client.getInputStream();
String returnString = "";
if (port == MainActivity.PORT_SENSOR_COMM) {
// do something
} else if (port == MainActivity.PORT_IMAGE_COMM) {
//do something
}
serverSocket.close();
return returnString;
} catch (Exception e) {
return "Exception Occurred:" + e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
boolean startNewTask = true;
if (port == MainActivity.PORT_SENSOR_COMM) {
//do something
} else if (port == MainActivity.PORT_IMAGE_COMM) {
//do something
}
//doing this to start listening for new messages again
new MessageReceiver(context, port).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
protected void onPreExecute() {
}
}
我现在想知道 Android WiFiDirect 是否允许在不同端口上的两个设备之间进行并行通信。搜索了文档,但找不到太多帮助。我做错了什么?完成我想做的事情的正确方法是什么?任何帮助将不胜感激。感谢您的关注。