2016-04-26 26 views
0

私は、サーバーがLinux上で動作するjava TCPサーバーで、クライアントがAndroid Studioで開発されたAndroidアプリケーションであるクライアントとサーバーのペアを作成しています。ソケット経由でオブジェクトを送信するjava TCPサーバーとアンドロイドアプリケーション

Messageオブジェクトをお互いに送信するクライアントとサーバーのペアを正常に作成しましたが、Androidアプリで同様の機能を実装しようとすると何も起こりそうにありません。

Androidアプリの作品だけではなく、ObjectOutput/InputStreamクラスからreadObject()writeObject()と、BufferedReaderPrintwriterクラスからreadLine()println()方法でStringsを送信中。

また、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

私はそれがコマンドラインクライアントで動作しているので、サーバが正しく動作していると思う。アンドロイドアプリからの接続方法を追加しました – Jokke

+0

だから私は何を伝えることができますか?あなたは正しいメインスレッド上のネットワークを行っていないのですか? – 3kings

答えて

0
  • あなたは、両端に、ObjectInputStreamObjectOutputStreamを作成する必要があります。そうしないと、デッドロックが発生する可能性があります。
  • 読み取りループが正しくありません。 readObject()は、ストリームの最後にnullを戻さないため、ループ条件としてnullを使用することは意味をなさない。ヌルを送信するときはいつでもnullを返すことができます。 EOFExceptionが捕捉されると、ループは終了するはずです。
関連する問題