2016-04-26 108 views
0

我正在寫一個客戶端 - 服務器對,其中服務器是在Linux上運行的Java TCP服務器和客戶端是Android Studio中開發的Android應用程序。發送通過套接字的Java TCP服務器對象Android應用

我已經成功地做了一個客戶端 - 服務器對發送Message對象給對方,但是當我嘗試在我的Android應用什麼來實現類似的功能似乎發生。

的Android應用作品,而只是發送StringsBufferedReaderPrintwriterreadLine()println()方法,但不能從ObjectOutput/InputStreamreadObject()writeObject()

也試過writeUnshared()/readUnshared()方法沒有運氣。

//Message.java 
package Message; 
import java.io.*; 

public class Message implements Serializable { 
    String msg; 
    String tag; 
    String username; 

    private static final long serialVersionUID = 4L; 
     // Methods. 
    } 

    // Reading MessageObjects in Server.java. 
    @Override 
    public void run() { 
     Message message = null; 
     try { 
      while ((message = (Message)reader.readObject()) != null) { 
       // Processing message. 
      } 
     } 
    } 

    // Sending Message Objects in android App. 
    public void onClick(View v) { 
     if(!msgBox.getText().toString().equals("")) { 
      final String msg; 
      try { 
       msg = msgBox.getText().toString(); 
       writer.writeObject(new Message(msg, CLIENT, username)); 
       msgBox.setText(""); 
       writer.flush(); 
       // Updating ui etc. 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      textBox.smoothScrollBy(textBox.getMaxScrollAmount(), 100); 
     } 
    } 

    // Connection-method in android app, initalizes streams. 
    private boolean connect(String username, String address, int port) { 
     boolean connected = false; 
     try { 
      server = new Socket(address, port); 
      InputStreamReader(server.getInputStream()); 
      reader = new ObjectInputStream(server.getInputStream()); 
      writer = new ObjectOutputStream(server.getOutputStream()); 
      writer.writeObject(new Message("!newUser",AUTOMATED,username)); 
      writer.flush(); 
      connected = true; 
      System.out.println("Connected!"); 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
      System.out.println("Cannot Connect!"); 
      connected = false; 
      // UI-things. 
     } 
     if(connected){ 
      // Thread that listens for replies. 
      listenThread(); 
     } 
     return connected; 
    } 
+0

在哪裏,這些所謂的'ObjectInput'和'ObjectOutput'流聲明並初始化?我不認爲你真的向我們展示了完整的問題 – 3kings

+0

我認爲服務器工作正常,因爲我得到它與命令行客戶端一起工作。從Android應用程序添加連接方法 – Jokke

+0

因此,一切看起來不錯...從我可以告訴。你沒有在主線程上做任何正確的網絡連接? – 3kings

回答

0
  • 您需要創建ObjectInputStreamObjectOutputStream,兩端。否則,你可能會陷入僵局。
  • 你讀循環不正確。 readObject()在流結束時不返回null,因此將null用作循環條件沒有任何意義。它可以在您發送空值時返回null。當捕獲到EOFException時,循環應該終止。
相關問題