2016-04-06 19 views
0

2つの数字を入力するアプリケーションを作成しようとしています。数字が解析され、TCPプロトコル経由でサーバーに送信されてから追加され、戻されて設定されますTextFieldに追加します。問題は、BufferedReaderストリームと違って、run()メソッドが数値の入力を待っていないことです。私は現在、DataInputStreamとDataOutPutStreamを使って作業しています。run()メソッドがデータ入力を待っていません

次のコードは次のとおりです。

public class Server implements Runnable { 
     public Server(){ 

    } 

    @Override 
    public void run() { 
     while (true) { 
      try (ServerSocket serverSocket = new ServerSocket(1000); 
        Socket sSocket = serverSocket.accept(); 
    DataInputStream in = new DataInputStream(sSocket.getInputStream()); 
    DataOutputStream out = new DataOutputStream(sSocket.getOutputStream())) 
      { 
       System.out.println("Client connected."); 
       Integer s1 = in.read(); 
       Integer s2 = in.read(); 
       Integer result = s1 + s2; 
       out.write(result); 



      } 
      catch(IOException e) 
      { 
       System.out.println(e.getMessage()); 
      } 
     } 
    } 

} 

およびクライアントクラス:

bs.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ke) { 

      n1 = Integer.parseInt(tf1.getText()); 
      n2 = Integer.parseInt(tf2.getText()); 
      tf1.setText(String.valueOf(n1)); 
      tf2.setText(String.valueOf(n2)); 


        } 
    }); 

     } 
     @Override 
     public void run() { 
      try(Socket clientSocket = new Socket("localhost", 1000); 
     DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 
     DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream())) 

      { 
    out.write(n1); 
    out.write(n2); 
    Integer rezultat = in.read(); 
    tf3.setText(String.valueOf(result)); 

      } catch (IOException ex) { 
       System.out.println(ex.getMessage()); 
      } 

     } 
    } 

そして私は、メインクラス経由とスレッドの両方始めています。 ありがとうございます! :D

+0

- 1クライアントで?もしそうなら、どうやっていつ始めているのですか? – Kenney

+0

Serverクラスのrun()メソッドが値を入力してボタンを押すのを待っているわけではないので、プロジェクトを実行するときに整数にデフォルト値の0が割り当てられます...私は両方のクラスを開始していますメインクラスのスレッドを介して。 –

+0

問題はおそらくあなたが投稿しなかったコードにあります。考え方は次のとおりです。サーバーは1つのServerSocketをループではなく1回だけ開き、ループ内で接続を受け入れます。サーバ側で "Client connected"と表示された場合、クライアントが接続しました。つまり、クライアントの 'run'メソッドが実行されたことを意味します。私の理解は、あなたのクライアントは2つのテキストフィールドの他にボタンがあり、あなたがそれを押すと、サーバーは追加を実行するように連絡するつもりです。この場合、クライアントスレッドを 'main'で開始するのではなく、ボタンを押すためのイベントハンドラで開始します。 – Kenney

答えて

0
あなたのコードだけでこの問題を解決するためにいくつかの変更を必要とする

:まず、あなたの主に、

Thread clientThread = new Thread(new Klijent()); 
    clientThread.start(); 

あなたがバックグラウンドでサーバーをお勧めします

Thread serverThread = new Thread(new Server()); 
    serverThread.start(); 
    new Klijent(); 

と交換し、ボタンイベントハンドラでコードを実行しない - サーバーは別のプログラムとして実行できるはずです。それが今mainで行われているので

第二に、Klijentコンストラクタで、コンストラクタから

Server s = new Server(); 

を削除し、

  s.run(); 

  run(); 

を呼び出すために置き換えますサーバーの代わりにクライアントの実行方法


割り当てが要求を行うクライアント・スレッドを使用すると言う場合は、あなたもあなたのボタンのイベントハンドラで第二のスレッドを追加することができます: `ラン()`メソッド

public void actionPerformed(ActionEvent ke) { 
     n1 = ... 
     n2 = ... 
     new Thread(Klijent.this).start(); // instead of this.run(); 
    } 
+0

ありがとうございました! これはついに私を助けました! :) プログラムは現在動作しています。あなたに貸しがある ;) –

関連する問題