2015-04-06 87 views
0

我目前有一个应用程序可以将字符串从一个设备发送到另一个设备。 我通过打开设备连接到组所有者的端口来监视此初始文件传输,然后客户端发送文件,组所有者收到它没有问题。套接字关闭。如何监视Android Wifi Direct(P2P)上的传入文件传输请求

但是,如果客户端试图发送第二个文件,套接字已关闭,连接状态没有改变,所以我想不出一种方法让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; 
} 

感谢您的帮助。

+0

为什么不保持服务器套接字打开? – 2015-04-06 13:58:38

+0

我留下了一个开放式插座的印象是不好的做法。这可能确实有效,但我没有考虑到它。所以这引发了一个后续问题。 如果插座保持打开状态,我将如何听它以获取传入的消息? – KevMscotland 2015-04-06 14:02:51

+0

检查我的更新答案。服务器需要持续监听套接字,因为您永远不知道客户端何时想连接到它。所以当它发生时,它会运行另一个线程来处理客户端,同时它始终监听其他连接。 – 2015-04-06 14:11:17

回答

0

基本上你需要让服务器套接字始终监听连接。而当它接受一个,它会在不同的线程

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

的MultiThreadServer会做你想要什么都与客户做的,然后它会关闭在它被连接到客户端的插口运行。请注意,这是与服务器在while循环中侦听的套接字不同的套接字。

多线程服务器

检查这更多的相关信息:http://www.tutorialspoint.com/javaexamples/net_multisoc.htm

+0

这确实奏效。感谢您的回复:) – KevMscotland 2015-04-06 15:20:36

+0

太好了。请接受答案,以便其他人将从中受益! – 2015-04-06 15:21:44