2016-12-20 3 views
0

私はこの質問の前に求めていた...私は私は私のJavaアプリケーションをテストする必要がありbeacuse、私のネットワークでTCPソケットの動作をテストしたいソケットサーバークライアントスレッド、Javaの

...

Iスレッドを使用してサーバークライアントモデル例、...ここで

ここ

public class ConsumerServer extends Thread { 
    private ServerSocket SrvrScktConsumer; 
    Socket clientSocket = null; 
    private boolean isConsumerRunning = false; 

    public ConsumerServer(int ConsPort) { 
     try { 
     SrvrScktConsumer = new ServerSocket(ConsPort); 
     System.out.println(NL + "ConsumerServer Listening on port number: " + ConsPort); 
     } catch (IOException e) { } 
    } 

    @Override public void run() { 
     try { 
     clientSocket = SrvrScktConsumer.accept(); 
     InputStream input; 
     byte[] innerBytes = new byte[1024]; 
     try { 
      input = clientSocket.getInputStream(); 
      Integer iRemotePort = clientSocket.getPort(); 
      String sRemoteHost = clientSocket.getInetAddress().getHostAddress(); 
      System.out.println("ConsumerServer: Remote Connection\n\tPort:" + iRemotePort+ " Host:" + sRemoteHost); 
      isConsumerRunning = true; 
      while (isConsumerRunning) { 
      try { 
       byte[] incomingBytes = Arrays.copyOf(innerBytes, input.read(innerBytes)); 
       jtaMessages.append(NL + "Consumer GET " + new String(incomingBytes)); 
       jtfLastReceived.setText(new String(incomingBytes)); 
      } catch (IOException | NegativeArraySizeException | IndexOutOfBoundsException e) { 
       isConsumerRunning = false; 
      } 
      } 
      System.out.println(NL + "ConsumerClient closing from Host " + sRemoteHost + " Port " + iRemotePort); 
      try { if (input != null) input.close(); } catch (IOException e) { } 
     } catch (IOException e) { 
      System.out.println(NL + "Error Creating ConsumerClient\n\t:" + e.toString()); 
     } 
     } catch (IOException | NullPointerException e) { 
      System.out.println(NL + "ConsumerServer Stopped: " + e.toString()) ; 
     } 
     System.out.println(NL + "Exiting ConsumerServer..."); 
    } 

    public void stopServer() { 
     try { 
     SrvrScktConsumer.close(); 
     } catch (IOException | NullPointerException e) { } 
     try { 
     clientSocket.close(); 
     } catch (IOException | NullPointerException e) { } 
     isConsumerRunning = false; 
    } 
    }; 

ProducerClient

ConsumerServerを作成10
public class ProducerClient extends Thread { 
    private Socket clientSocket = null; 
    private OutputStream output = null; 
    private boolean isProducerRunning = false; 

    public ProducerClient(String ConsHost , int ConsPort) { 
     try { 
     clientSocket = new Socket(ConsHost, ConsPort); 
     output = clientSocket.getOutputStream(); 
     System.out.println(NL + "ProducerClient Connected to port number: " + ConsPort); 
     } 
     catch (IOException e) { } 
    } 

    @Override public void run() { 
     if (!(clientSocket == null)) { 
     Integer iLocalPort = clientSocket.getLocalPort(); 
     String sLocalHost = clientSocket.getLocalAddress().getHostAddress(); 
     System.out.println("ConsumerServer: Local Connection\n\tPort:" + iLocalPort+ " Host:" + sLocalHost); 
     int ctrlPrintOut = 0, ctrlPrintIn = 0; 
     isProducerRunning = true; 
     while (isProducerRunning) { 
      try { 
      if (bProducerReady) { 
       bProducerReady = false; 
       output.write(jtfSendMessage.getText().getBytes()); 
       jtaMessages.append(NL + "Producer PUT " + jtfSendMessage.getText()); 
       jtfSendMessage.setText(""); 
      } 
//   // Ini Code Block to delete 
//   else { 
//    try { 
//    Thread.sleep(1); 
//    } catch (InterruptedException ex) { } 
//    if (ctrlPrintOut == 1000000 /*Integer.MAX_VALUE*/) { 
//    if (ctrlPrintIn == 2) { 
//     System.out.println("ProducerClient Waiting!"); 
//     ctrlPrintIn = 0; 
//    } 
//    ctrlPrintIn++; ctrlPrintOut = 0; 
//    } 
//    ctrlPrintOut++; 
//   } 
//   // End Code Block to delete 
      } catch (IOException e) { 
      System.out.println("ProducerClient: " + e.toString()); 
      isProducerRunning = false; 
      } 
     } 
     try { output.close(); } catch (IOException e) { } 
     try { clientSocket.close(); } catch (IOException e) { } 
     System.out.println(NL + "Exiting ProducerClient..."); 
     } 
    } 

    public void stopClient() { 
     try { 
     clientSocket.close(); 
     } catch (IOException | NullPointerException e) { } 
     isProducerRunning = false; 
    } 
    }; 

私が指定したブロックコードを削除したいのですが、削除するときに...私のテストが正しく動作しません。ここで

クラスの前に使用してクラスが

public class ClientServerShort extends JFrame { 

    private JButton jbSendMessage = new JButton("Send Message"); 
    private JLabel jlLastReceived = new JLabel("Last Received"); 
    private JTextArea jtaMessages = new JTextArea(5,20); 
    private JScrollPane jspMessages = new JScrollPane(jtaMessages); 
    private JToggleButton jtbConsumer = new JToggleButton("Launch Consumer Server"); 
    private JToggleButton jtbProducer = new JToggleButton("Launch Producer Client"); 
    private JTextField jtfLastReceived = new JTextField(); 
    private JTextField jtfSendMessage = new JTextField(); 

    static boolean bProducerReady = false; 
    static final String NL = System.getProperty("line.separator"); 
    ConsumerServer thrdConsumerServer = null; 
    ProducerClient thrdProducerClient = null; 

    public ClientServerShort() { 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    jbSendMessage.addActionListener((ActionEvent evt) -> { 
     if (!jtfSendMessage.getText().isEmpty()) { 
     bProducerReady = true; 
     } 
    }); 

    jlLastReceived.setBorder(BorderFactory.createEtchedBorder()); 
    jlLastReceived.setHorizontalAlignment(SwingConstants.CENTER); 

    jtbConsumer.addActionListener((ActionEvent evt) -> { 
     if (jtbConsumer.isSelected()) { 
     if (thrdConsumerServer == null) { 
      thrdConsumerServer = new ConsumerServer(1027); 
      thrdConsumerServer.start(); 
     } 
     } else { 
     if (thrdConsumerServer != null) { 
      thrdConsumerServer.stopServer(); 
      thrdConsumerServer = null; 
     } 
     } 
    }); 
    jtbProducer.addActionListener((ActionEvent evt) -> { 
     if (jtbProducer.isSelected()) { 
     if (thrdProducerClient == null) { 
      thrdProducerClient = new ProducerClient("192.168.0.49", 1027); 
      thrdProducerClient.start(); 
     } 
     } else { 
     if (thrdProducerClient != null) { 
      thrdProducerClient.stopClient(); 
      thrdProducerClient = null; 
     } 
     } 
    }); 

    jtfLastReceived.setEditable(false); 

    JPanel jpMessagesUp = new JPanel(); 
    jpMessagesUp.setLayout(new GridLayout(2, 2, 6, 6)); 
    jpMessagesUp.add(jbSendMessage); 
    jpMessagesUp.add(jtfSendMessage); 
    jpMessagesUp.add(jlLastReceived); 
    jpMessagesUp.add(jtfLastReceived); 

    getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); 
    add(jtbProducer); 
    add(jtbConsumer); 
    add(jpMessagesUp); 
    add(jspMessages); 
    pack(); 
    } 

    public static void main(String args[]) { 
    EventQueue.invokeLater(() -> { 
     new ClientServerShort().setVisible(true); 
    }); 
    } 

} 

質問:理由は何

、なぜ私はインクルードは(ProducerClientで)スニペットコードを示して削除し、私のシングルアプリケーションが動作しません。 ?

+0

私はあなたの最初の声明を「同様の質問はすでに私にとっては閉じていた」としています。それがこの問題にも起こります。 SOは "あなたのためにあなたの巨大な製品をデバッグする"サービスではありません。ご覧のとおり、ここには重大な**金額を落とします。そして何?あなたはそれをすべて消化して、カウンターループを持つ単一のスリープステートメントがコードの動作を変更する理由を理解することを期待していますか? – GhostCat

+0

@GhostCat残念ながら、私のアカウントは利用できません。質問の前に私は無回答で削除しました。 –

+0

ちょうど言っておきます。私は、あなたがそのような入力に多くの肯定的なフィードバックを受け取ることはないと思います。このサイトの内容と、ここでどのように/何を尋ねるべきかを理解するには、[ヘルプ]で楽しい時間を過ごしてください。言われているように、このような入力...一般的に役に立たない答えに関してはうまくいかない。 – GhostCat

答えて

0

理由はまさに私があなたの他の質問であなたに言ったことです。 bProducerReadyは、異なるスレッドから読み書きしているときには、volatileである必要があります。あなたの奇妙な遅延コードは、ちょうど時間を経て同じメモリフラッシュを達成します。

NB staticである必要はありません。

なぜあなたはこの回答の質問を投稿したのか不思議です。

+0

私は答えた理由を教えてくれました。実際にここで物事を読んでいないという歴史があるようです。 – EJP

+0

@nitwit誰かが前の答えを落として同じことを言っていました。 – EJP