【问题标题】:How to monitor for incoming file transfer requests on Android Wifi Direct (P2P)如何在 Android Wifi Direct (P2P) 上监控传入的文件传输请求
【发布时间】:2015-04-06 22:09:41
【问题描述】:

我目前有一个应用程序可以将字符串从一台设备发送到另一台设备。 我通过打开与组所有者的设备连接端口来监视此初始文件传输,然后客户端发送文件并且组所有者接收它没有问题。套接字关闭。

但是,如果客户端尝试发送第二个文件,则套接字已关闭,连接状态并没有改变,所以我想不出一种方法让 GO 为第二次传输重新打开套接字。有什么建议吗?

套接字的初始打开。

if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            // Respond to new connection or disconnections
            FileServerAsyncTask at = new FileServerAsyncTask(getApplicationContext());
            at.execute();
}

文件传输异步任务:

public class FileServerAsyncTask extends AsyncTask<Void, Void, String[]> {

    private Context context;

    public FileServerAsyncTask(Context context) {
        this.context = context;

    }

    @Override
    protected String[] doInBackground(Void... params) {
        try {
            ServerSocket serverSocket = new ServerSocket(2553);
            Socket client = serverSocket.accept();
            String[] message = getMessage(client);
            serverSocket.close();
            return message;
        } catch (IOException e) {
            //  Error message.
            return null;
        }
    }

    @Override
    protected void onPostExecute(String[] result) {
        if (result != null) {
            //  Do something with result.
        }

    }
}

为了完整起见,我传达信息的方式:

public static String[] getMessage(Socket s)
        throws IOException {

    InputStream is = s.getInputStream();
    int len = is.available();
    Reader reader = null;
    reader = new InputStreamReader(is, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    String msg = new String(buffer);

    String[] myMessageArray = msg.split(",");
    return myMessageArray;
}

感谢您的帮助。

【问题讨论】:

  • 为什么不保持服务器套接字打开?
  • 我的印象是留下一个开放的套接字是不好的做法。这也许确实可行,但我没有考虑过。因此,这引发了一个后续问题。如果套接字保持打开状态,我将如何收听它以获取传入消息?
  • 检查我更新的答案。服务器需要继续侦听套接字,因为您永远不知道客户端何时想要连接到它。所以当它这样做时,它会运行另一个线程来处理客户端,同时它总是在监听其他连接。

标签: android sockets p2p


【解决方案1】:

基本上,您需要让服务器套接字始终监听连接。当它接受一个时,它将在不同的线程中运行它

  while (true) {
         Socket socket = serverSocket.accept();
         new Thread(new MultiThreadServer(socket)).start();
      }

MultiThreadServer 会做任何你想对客户端做的事情,然后它会关闭它连接到客户端的套接字。请注意,这与服务器在 while 循环中侦听的套接字不同。

查看更多关于多线程服务器的信息:http://www.tutorialspoint.com/javaexamples/net_multisoc.htm

【讨论】:

  • 太棒了。请接受答案,以便其他人从中受益!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多