2017-01-09 133 views
0

我寫了一個PC和手機之間的服務器 - 客戶端通信。 PC是用Python編寫的服務器,方便的是用Android(Java)編寫的客戶端。接收服務器響應時出錯

註冊後,雙方發送他們的名字和一些JSON-String從手機發送到PC。 這個工程沒有任何異常

然而,當我嘗試檢查輸入數據後,收到服務器的回答,我得到以下異常:

I/Timeline: Timeline: Activity_idle id: [email protected] 
time:69321819 
D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN 
W/System.err: java.net.SocketException: Socket is closed 
W/System.err: at java.net.PlainSocketImpl.checkNotClosed(PlainSocketImpl.java:116) 
W/System.err: at java.net.PlainSocketImpl.getInputStream(PlainSocketImpl.java:213) 
W/System.err: at java.net.Socket.getInputStream(Socket.java:363) 
W/System.err: at com.dmd_data.soft_zeiterfassung.daten_transfer$MyClientTask.doInBackground(daten_transfer.java:267) 
W/System.err:  at com.dmd_data.soft_zeiterfassung.daten_transfer$MyClientTask.doInBackground(daten_transfer.java:108) 
W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
W/System.err:  at java.lang.Thread.run(Thread.java:818) 
I/Timeline: Timeline: Activity_launch_request id:com.dmd_data.soft_zeiterfassung time:69322601 
D/Activity: performCreate Call secproduct feature valuefalse 
D/Activity: performCreate Call debug elastic valuetrue 
I/Timeline: Timeline: Activity_idle id: [email protected] time:69323717 

我的Android代碼如下所示:

public class MyClientTask extends AsyncTask<Void, Void, Void> { 

    String dstAddress; 
    int dstPort; 
    String message = ""; 
    String response = ""; 
    String failMessage = ""; 
    int timeoutMs; 
    String kontoVorname; 
    String kontoNachname; 
    String userName; 

    MyClientTask(String addr){ 

     dstAddress = addr; 
     dstPort = 9090; 
     timeoutMs = 1000; 
     SharedPreferences systemDATA = getSharedPreferences("konto",0); 
     kontoVorname = systemDATA.getString("editText_vorname", ""); 
     kontoNachname = systemDATA.getString("editText_nachname", ""); 
     userName = kontoVorname+" "+kontoNachname; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     JSONArray arb_List = new JSONArray(); 
     JSONArray mat_List = new JSONArray(); 

     Cursor arb_Cursor = My_Database.getAllData(); 

     if (arb_Cursor.getCount() == 0){ 

      Intent click_datenbank = new Intent(daten_transfer.this,pop_datenbank.class); 
      startActivity(click_datenbank); 

     }else { 

      Socket socket = null; 

      try { 

       SocketAddress sock_addresse = new InetSocketAddress(dstAddress, dstPort); 
       socket = new Socket(); 
       socket.connect(sock_addresse, timeoutMs); 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
       failMessage = "IP-ADRESSE UNBEKANNT:\n" + e.toString(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
       failMessage = "PC NICHT ERREICHBAR:\n"+ e.toString(); 
      } 

      SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); 
      String dateTime = sdf.format(new Date()); 

      //Receive server name 
      ByteArrayOutputStream bAPS_Name = new ByteArrayOutputStream(25000); 
      byte[] bytes_Name = new byte[25000]; 
      int int_server; 
      InputStream input_Name = null; 
      try { 
       input_Name = socket.getInputStream(); 
       int_server = input_Name.read(bytes_Name); 
       bAPS_Name.write(bytes_Name, 0, int_server); 
       response += bAPS_Name.toString("UTF-8"); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      //Create datalist 
      arb_Cursor.moveToFirst(); 
      while (arb_Cursor.isAfterLast() == false) { 

       int totalArbeit = arb_Cursor.getColumnCount(); 
       JSONObject row_SEND = new JSONObject(); 

       for(int i=0 ; i< totalArbeit ; i++){ 

        if(arb_Cursor.getColumnName(i) != null){ 

         try{ 
          if(arb_Cursor.getString(i) != null){ 

           row_SEND.put(arb_Cursor.getColumnName(i) , arb_Cursor.getString(i)); 
          } 
          else 
          { 
           row_SEND.put("NONE" , "---"); 
          } 
         } 
         catch(Exception e) 
         { 
          e.getMessage(); 
          failMessage = "SORRY,SOMETHING GOES WRONG:\n" + e.toString(); 
         } 
        } 
       } 
       arb_List.put(row_SEND); 
       arb_Cursor.moveToNext(); 
      } 
      arb_Cursor.close(); 

      //Send 
      JSONObject json = new JSONObject(); 

      try (OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)){ 

       json.put("User",userName); 
       json.put("Datetime",dateTime); 
       json.put("Datalist",arb_List); 
       writer.write(json.toString()); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       failMessage = "SORRY, SOMETHING GOES WRONG...:\n" + e.toString(); 
      } 

      // Until here it works 
      //################################################################################## 

      InputStream input_Response = null; 
      try { 
       input_Response = socket.getInputStream(); 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input_Response)); 
       String line = ""; 
       while((line = bufferedReader.readLine()) != null) { 
        message += line; 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      //################################################################################## 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     if (failMessage.length()!= 0){ 
      Toast.makeText(daten_transfer.this,failMessage,Toast.LENGTH_LONG).show(); 
      //Intent click_transfer = new Intent(daten_transfer.this,pop_wlan.class); 
      //startActivity(click_transfer); 
     } 
     else{ 
      SharedPreferences systemDATA = getSharedPreferences("konto",0); 
      SharedPreferences.Editor editor = systemDATA.edit(); 
      //editor.putString("failmessage",failMessage); 
      //editor.commit(); 
      editor.putString("response",response); 
      editor.commit(); 

      if (response.length() != 0){ 
       Intent click_transfer = new Intent(daten_transfer.this,pop_tansfer.class); 
       startActivity(click_transfer); 
      } 

      textView_show.setText(message); 
     } 
    } 
} 

我曾嘗試一切盡我所能,但無論我做什麼,我總是得到答案:

java.net.SocketException: Socket is closed 

回答

0

完成輸出流後關閉OutputStreamWriter寫入器變量。由於您仍在使用它,套接字很忙。 試試下面的代碼片段

json.put("User",userName); 
json.put("Datetime",dateTime); 
json.put("Datalist",arb_List); 
writer.write(json.toString()); 
writer.close(); 

這是一個很好的做法在使用後關閉套接字了。

相關問題