2016-04-06 14 views
0

İki sayı girdiğiniz bir uygulamayı yapmaya çalışıyorum, numaralar ayrıştırılıyor ve TCP protokolü üzerinden sunucuya gönderiliyor, ardından ekleniyor, geri dönüyor ve ayarlanıyor bir TextField. Sorun, BufferedReader akışlarının aksine run() yönteminin girilecek sayıları beklememesidir. Şu anda DataInputStream ve DataOutPutStream ile çalışıyorum.run() yöntemi veri girişi için beklemiyor

İşte aşağıdaki kod!

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()); 
      } 
     } 
    } 

} 

Ve Müşteri sınıfı:

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()); 
      } 

     } 
    } 

Ve ana sınıfı ve Konular aracılığıyla hem başlıyorum. Önceden teşekkürler! : D

+0

Hangi 'run()' yöntemi - birini Müşteri? Eğer öyleyse, nasıl ve ne zaman başlıyorsunuz? – Kenney

+0

Tamsayılar, projeyi çalıştırdığımda varsayılan değer olarak 0'a atanır çünkü Sunucu sınıfındaki run() yöntemi değerleri girmemi ve düğmeyi beklememi beklemiyor ... Her iki sınıfı da başlatıyorum Ana sınıftaki Konular üzerinden. –

+0

Sorun, muhtemelen göndermediğiniz koddadır. Buradaki fikir şudur: Sunucu bir ServerSocket açar - sadece bir kez, bir döngüde değil - ve bağlantıları kabul eder - bir döngü içinde. Sunucu tarafında "İstemci bağlandı" mesajını görürseniz, istemciniz bağlandı, yani istemcide "run" yöntemi çalıştırıldı. Anlayışım, istemcinizin 2 metin alanının yanında bir düğmesinin bulunmasıdır ve siz bastığınızda, eki gerçekleştirmek için sunucuyla iletişim kurmanız gerektiğini düşünüyorsunuz? Bu durumda, istemci iş parçacığını "ana" olarak başlatmak istemezsiniz, ancak düğme basma olay işleyicisinde istemezsiniz. – Kenney

cevap

0
Kodunuz sadece bu sorunu gidermek için birkaç değişiklik ihtiyacı

: birincisi, ana yılında,

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

arka planda sunucu isteyeceksiniz

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

ile değiştirin ve Düğme olay işleyicide kodu çalıştırmayın - sunucu ayrı bir program olarak çalışabilmelidir. şimdi main yapılır beri

İkincisi, Klijent yapıcı içinde, yapıcı gelen

Server s = new Server(); 

kaldırmak ve

  s.run(); 

ile

  run(); 

aramaya yerine sunucunun yerine istemci çalışma yöntemi. atama isteği yapmak için bir istemci iş parçacığı kullanımı diyorsa


, ayrıca düğme olay işleyicisi ikinci iplik ekleyebilirsiniz:

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

Çok teşekkür ederim efendim! Bu nihayet bana yardımcı oldu! :) Program şu anda çalışıyor. Sana borçlandım ;) –