2013-05-11 231 views
1

我已經實現了在我的PC上運行的Java TCP服務器,該服務器將接受從運行客戶端的Android設備發送的傳入消息。服務器只接收來自Android設備的消息併發回答案。一切正常,直到我嘗試從Android設備發送第二條消息:然後,應用程序崩潰!TCP - Android客戶端+ Java服務器

但我不知道爲什麼。我使用一個按鈕來發送先前寫入的消息。

這是服務器線程代碼(線程簡單地從使用run()主叫):

public class ServerThread extends Thread { 
     ServerSocket serverSocket; 

     public ServerThread() { 
     } 

     public void run() { 
      String incomingMsg; 

      try { 
       System.out.println("Starting socket thread..."); 

       serverSocket = new ServerSocket(21111); 

       System.out 
         .println("ServerSocket created, waiting for incomming connections..."); 

       Socket socket = serverSocket.accept(); 

       BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
         socket.getOutputStream())); 
       BufferedReader in = new BufferedReader(new InputStreamReader(
         socket.getInputStream())); 

       while (true) { 
        // System.out.println("Connection accepted, reading..."); 

        while ((incomingMsg = in.readLine()) != null && socket.isConnected()) { 
         System.out.println("Message recieved: " + incomingMsg 
           + ". Answering..."); 

         // send a message 
         String outgoingMsg = "Message \"" + incomingMsg 
           + "\" recieved on server." 
           + System.getProperty("line.separator"); 
         out.write(outgoingMsg); 
         out.flush(); 

         System.out.println("Message sent: " + outgoingMsg); 
        } 

        if (socket.isConnected()) System.out.println("Socket still connected"); 
        else System.out.println("Socket not connected"); 
       } 

      } catch (Exception e) { 
       System.out.println("Error: " + e.getMessage()); 
       e.printStackTrace(); 
      } 

     } 
    } 

這是客戶端的代碼。我使用的AsyncTask:

public class MainActivity extends Activity { 
    private static final String TAG = "MainActivity"; 

    private Button sendButton; 
    private EditText messageText; 
    private String messageToSend; 
    private ClientSender clientSender; 
    private Context context; 
    private Socket socket; 

    private static String SERVER_IP = "192.168.1.129"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     messageText = (EditText) findViewById(R.id.editTextMessage); 
     sendButton = (Button) findViewById(R.id.sendButton); 
     context = this.getApplicationContext(); 
     clientSender = new ClientSender(context); 
     socket = null; 

     sendButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       messageToSend = messageText.getText().toString() 
         + System.getProperty("line.separator"); 

       clientSender.execute(messageToSend); 

      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    private class ClientSender extends AsyncTask<String, Void, Socket> { 
     private Socket socket; 
     private String answer; 
     private Context context; 
     private BufferedWriter out; 
     private BufferedReader in; 

     public ClientSender(Context context) { 
      this.context = context; 
      socket = null; 
      out = null; 
      in = null; 
     } 

     @Override 
     protected Socket doInBackground(String... params) { 
      try { 
       if (socket == null) { 
        socket = new Socket(SERVER_IP, 21111); 

        out = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream())); 
        in = new BufferedReader(
          new InputStreamReader(socket.getInputStream())); 
       } 

       out.write(params[0]); 
       out.flush(); 

       answer = in.readLine() + System.getProperty("line.separator"); 

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

      return socket; 
     } 

     protected void onPostExecute(Socket socket) { 
      if (socket != null) { 
       Toast.makeText(context, answer, Toast.LENGTH_LONG).show(); 

      } else { 
       Toast.makeText(context, "Can't connect to server!", 
         Toast.LENGTH_LONG).show(); 
      } 

     } 

    } 

} 

我不知道這是怎麼回事,但我懷疑有可能是一些錯誤的套接字連接。

+0

請告訴我們堆棧跟蹤從崩潰 – GreyBeardedGeek 2013-05-11 14:11:32

+0

我執行客戶端的真實設備 – Ypsilon 2013-05-11 14:14:59

+0

在正常情況下堵漏電纜插入你的電腦可以讓你獲得logcat的。如果沒有,請考慮使用ACRA。 – 2013-05-11 14:50:53

回答

1

更改您的按鈕的onClick偵聽器,以便它每次創建一個新的ClientSender;

public void onClick(View v) { 
    messageToSend = messageText.getText().toString() + System.getProperty("line.separator"); 
    new ClientSender(Activity.this).execute(messageToSend); 
} 
0

基於只是快看,我猜你需要刪除的行:從您的onClick()方法

clientSender = new ClientSender(context); 

+0

感謝答案。我嘗試了一些解決之前,忘記刪除它,我刪除了它...但仍然行不通! – Ypsilon 2013-05-11 15:50:53