2015-04-06 85 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