2016-09-12 5 views
1

どうしたらいいの?私はここで問題を抱えています。ファイルは実行されていますが、論理エラーがあります。私はこのJavaアプリに私のアンドロイドアプリを接続しました。 JFrameのリストで複数のメッセージを送信しようとしていますが、JFrameが実行されている間は表示されません。それは次のようになります。この"while"ループを実行した後にMy JFrameが表示されます。実行中にJFrameを表示させたい

私は、javaアプリに接続する(JFrameのは、まだ表示されない)

それは私が私のAndroidアプリ

のJFrameを閉じた後、その後のprintln に示し、いくつかのメッセージを送信します(JFrameのは、まだ表示されません) (メッセージはJListに保存されています)

JFrameが表示されている間、私はJlistの値を追加したいと思っています。このコードを見てください。事前にみんなで

import android.app.Activity; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.EditText; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class MainActivity extends Activity { 

Socket socket = null; 
public String debuggingString = "DEBUG"; 
public String hostname = ""; // <-- my ipv4 is here 
public int portNumber = 60123; 

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

    new Thread() { 
     @Override 
     public void run() { 

      try { 
       //connecting 
       Log.e(debuggingString, "Attempting to connect to server"); 
       socket = new Socket(hostname, portNumber); 

       //Send message to server 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
       bw.write("this is a message from the client"); 
       bw.newLine(); 
       bw.flush(); 

       //Receive message from server 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       System.out.println("Message from server: " + br.readLine()); 
      } catch (
        Exception e 
        ) 

      { 
       Log.e(debuggingString, e.getMessage()); 
      } 
     } 

    }.start(); 
} 

; 

public void sendMessage(View v) { 
    EditText editText = (EditText) findViewById(R.id.editText); 

    BufferedWriter bw = null; 

    try { 
     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     bw.write(editText.getText().toString()); 
     bw.newLine(); 
     bw.flush(); 
    } catch (Exception e) { 
     Log.e(debuggingString, e.getMessage()); 
    } 
} 
} 

ありがとう:これは

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JList; 


public class frmTestList extends JFrame { 
public static final int portNumber = 60123; 
private JPanel contentPane; 
static String data; 
static DefaultListModel model = new DefaultListModel(); 
/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 

      frmTestList frame = new frmTestList(); 
       frame.setVisible(true); 
       try { 


        ServerSocket serverSocket = null; 
        serverSocket = new ServerSocket(portNumber); 
        Socket socket = serverSocket.accept(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

         while((data = br.readLine()) != null){ 

         System.out.println("Message from the client: " + data); 
         model.addElement(data); 
         } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public frmTestList() { 


    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JList list = new JList(model); 
    contentPane.add(list, BorderLayout.CENTER); 


} 




} 

Androidのコードを使用してコードイムです!

+0

サイドノート:ClassNamesはJavaのUpperCaseになります。だから、frmTestListは単に悪い名前です! – GhostCat

+0

ヒント:私の簡単な提案がすでに成果を上げているかどうかお知らせください。 – GhostCat

+0

サイドノート、@GhostCatありがとうございました。しかし、あなたが提案した解決策はまだ機能していません。 – NewbieProgrammer

答えて

0

アップデート:さらに思考の後、私は推測しています:あなたの問題が可能性があり

サーバーが座っていると、クライアントからの入力を待ち

A)。意味:それは "新しい入力"でループします...おそらくそれまでクライアントは接続を閉じます。あなたの「サーバー」は受け入れ同じスレッド内のUIを更新しようとしていること

および/または

B)。したがって、試してみてください:

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String line = null; 
while((line = br.readLine()) != null) { 
    System.out.println("Message from server: " + br.readLine()); 
    EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     model.addElement(line); 
    } 

最後に、それらのアイデアがうまくいかない場合。あなたの設定を簡単にする(Androidを写真から取り除く)ことで、JFrame内にクライアントソケットを作成し、その1つのプロセスを同時にクライアント/サーバにすることができます。これにより、デバッグ/実験がはるかに簡単になります。それが動作するときだけ、クライアントを別のJVMに移動してから、「Android」に移動します。

言い換えれば、1つのクラスですべてを行う非常に単純なクライアント/サーバーテストから始めてください。それがうまくいくと、動いてください。

+0

こんにちは、@GhostCat!私はあなたの提案された解決策を試みましたしかし、それは私がそれを望む方法でまだ働いていません。ありがとう、しかし! – NewbieProgrammer

+0

さて、「私が望むように働かない」とは、その変更を加えることによって何が変わったのかを言わない。あなたが私たちに他のアイデアを提供してもらいたいのであれば、どちらが必要でしょうか。 – GhostCat

+0

もちろん、GhostCat!私はあなたから他のアイデアを試してみたいと思う。これは私のプログラムの現在の状態フローで​​す。 (Jframeが表示されています)Javaアプリが実行されています (Jframeが表示されています)android appからjava appにメッセージを送信 Androidアプリを閉じると、 プログラムがこのように動作するようにしたい (Jframeが表示されています)アンドロイドアプリからJavaアプリにメッセージを送信し、その時点でリスト値を変更します。アンドロイドアプリからボタンをクリックします。 – NewbieProgrammer

0

JFrameが表示されない理由は、イベントディスパッチスレッドからすべてのソケットを読み取っているためです。これを行うと、すべてのUIアップデートがロックされます。 JListモデルを更新するときは、読み込みアクションを独自のThreadに移動し、invokeLaterを呼び出します。

public static void main(String[] args) { 
    frmTestList frame = new frmTestList(); 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      frame.setVisible(true); 
     } 
    }); 

    Runnable runnable = new Runnable() { 
     public void run() { 
      try { 
       ServerSocket serverSocket = new ServerSocket(portNumber); 
       Socket socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

       while((data = br.readLine()) != null) { 
        EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          model.addElement(data); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    new Thread(runnable).start(); 
} 
+0

こんにちは、@eighthrazz!ゴーストキャットの答えはすでに私のために働いていた。しかし、もう一つの解決策を提供してくれてありがとう。あなたが提供したソリューションから他の人々が恩恵を受けることを願っています!ありがとうございました! – NewbieProgrammer

関連する問題