2016-12-20 4 views
0

Ich war vor diese Frage ...Socket Server Client-Thread, Java

ich die TCP-Socket-Verhalten in meinem Netzwerk testen möchten, beacuse ich meine Java-Anwendungen testen müssen ...

I eine Server-Client-Modell Beispiel erstellt, Themen ...

Hier die ConsumerServer

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

Hier die ProducerClient

mit 10

Ich möchte den angegebenen Blockcode entfernen, aber wenn ich entferne .. Mein Test funktioniert nicht richtig.

Hier ist die Klasse vor Klassen mit

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

} 

Frage:

Was ist der Grund, warum entferne ich die Snippet-Code angeben (in ProducerClient), meine Einzel App funktioniert nicht ?

+0

Ich nehme Ihre erste Aussage als "eine ähnliche Frage wurde mir bereits geschlossen". Das wird auch mit dieser Frage geschehen. SO ist kein "Wir debuggen Ihr riesiges Produkt für Sie" -Service. Sie sehen, Sie fallen hier eine ** ernste ** Menge. Und dann was? Sie erwarten, dass wir all das verdauen, um dann herauszufinden, warum eine einzelne Schlafanweisung mit einer Zählerschleife das Verhalten Ihres Codes verändert? – GhostCat

+0

@GhostCat Leider ist mein Account nicht verfügbar und vor Frage habe ich ohne Antwort gelöscht. –

+0

Nur sagend: Ich denke, dass Sie nicht viel positives Feedback auf solche Eingabe erhalten werden. Sie sollten etwas Zeit bei [Hilfe] verbringen, um zu verstehen, worum es auf dieser Seite geht und wie/was Sie hier fragen. Wie gesagt, geht es bei solchen Eingaben normalerweise nicht zu gut in Bezug auf hilfreiche Antworten. – GhostCat

Antwort

0

Der Grund ist genau das, was ich Ihnen in Ihrer anderen Frage gesagt habe. bProducerReady muss volatile sein, da Sie es aus verschiedenen Threads lesen und schreiben. Ihr seltsamer Verzögerungscode führt die gleiche Speicherbereinigung nur über die verstrichene Zeit durch.

Hinweis: Es muss nicht static sein.

Warum Sie diese beantwortete Frage erneut gepostet haben, bleibt ein Rätsel.

+0

Ich habe dir den Grund in meiner Antwort gesagt. Es scheint eine Geschichte zu geben, die Dinge hier nicht wirklich zu lesen. – EJP

+0

@nitwit, der die vorherige Antwort mit der gleichen Antwort abgelehnt hat: Bitte beachten Sie. – EJP