2016-06-04 14 views
0

Ich bin in den frühen Phasen der Arbeit mit einem Server und Client-Verbindungen über Sockets. In meiner „ServerMain“ Klasse, gebe ich dem Server einen Port auf durch einen JTextField laufen, die es durch eine Action auf einem JButton eintritt. Sobald ich den Knopf drücke, wird er grau, und der JTextArea darunter hört auf, Text anzuhängen. Welche Änderungen muss ich vornehmen, damit die Schaltfläche und der Textbereich nach dem Serverstart weiterhin funktionieren?Warum reagiert dieser JButton nicht, nachdem er gedrückt wurde?

ServerMain:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 


public class ServerMain extends JFrame{ 

    GraphicPanel m; 
    final static String newLine = "\n"; 
    public static void main(String[] args) { 

    ServerMain s = new ServerMain("Testing Server"); 
    s.setUpUI(); 
    s.pack(); 
    s.setVisible(true); 
    } 

    private void setUpUI() { 
     m = new GraphicPanel(this); 
     m.initialize(); 
     this.add(m); 
     this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
    } 
    public void hostPort(String port){ 
    System.out.println("Running hostPort method"); 
    int p=-1; 
    try{ 
     p= Integer.parseInt(port); 
    } 
    catch(Exception e){ 
     JOptionPane.showInternalMessageDialog(this, "Must enter a number(0 - 65500) for the port"); 

    } 
    m.print(""+p); 
    m.print("Running Try."); 
    try { 
     System.out.println("About to create socket"); 
     @SuppressWarnings("resource") 

     ServerSocket serverSocket = new ServerSocket(p); 
     m.print("got the socket."+serverSocket); 
     Socket[] clientSocket = new Socket[2]; 
     clientSocket[0] = serverSocket.accept(); 
     clientSocket[1] = serverSocket.accept(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket[0].getInputStream())); 
     m.print("Server Socket Initialized."); 
     System.out.println("S"); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      m.print(inputLine); 
      m.print("Client: "+in.readLine()); 
     } 
    } 
    catch (IOException e) { 
     m.print("Exception caught when trying to listen on port " 
       + port + " or listening for a connection "+newLine+e+newLine); 
     m.print(e.getMessage()); 
    } 

} 

    public ServerMain(String s){ 
     super(s); 
    } 

} 

Und schließlich die GraphicPanel:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 


public class GraphicPanel extends JPanel{ 
    private String ip = ""; 
    private String port = ""; 
    private JTextField txt_port = new javax.swing.JTextField(20); 
    private JTextArea txa_info; 
    private JButton but_conDC; 
    private ServerMain s; 
    final static String newLine = "\n"; 
    public GraphicPanel(ServerMain serv){ 
     this.s = serv; 
     this.setPreferredSize(new Dimension(800,200)); 
    } 

    public void initialize(){ 

     txa_info = new JTextArea(10,70); 
     but_conDC = new JButton("Connect"); 
     txt_port.setLocation(100, 100); 

     add(txt_port); 
     but_conDC.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       port = txt_port.getText(); 
       System.out.println(port + " was in the text box"); 
       if(port.equals("")){ 
        emptyPort(); 
        return; 
       } 
       but_conDC.setText("Disconnect"); 
       repaint(); 
       txa_info.setText("Hosting on port "+port); 
       s.hostPort(port); 
      } 
     }); 
     but_conDC.setSize(5, 5); 
     add(but_conDC); 
     txa_info.setSize(800, 100); 
     txa_info.setEditable(false); 

     add(txa_info); 
    } 

    public void print(String s){ 
     txa_info.append(s); 
    } 

    public void emptyPort() { 
     txa_info.append("ERROR: Attempted to host with no port! Try entering something like 4444"+newLine); 
    } 
} 
+0

Werfen Sie einen Blick auf [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) aus den Gründen, warum und [Worker Threads und Swingworker] (http: // docs. oracle.com/javase/tutorial/uiswing/concurrency/worker.html) für eine mögliche Lösung – MadProgrammer

Antwort

1

In Ihrer Schaltfläche Aktion, Sie im Grunde einen Server-Socket öffnen und für einige Kommunikation warten. Da Sie dies im selben Thread tun, in dem sich die Benutzeroberfläche befindet, blockieren Sie die Lauffläche und machen eine weitere Interaktion mit der Benutzeroberfläche unmöglich.

Sie müssen einen anderen Thread starten und in die Thread-Kommunikation zwischen dem UI-Thread (in Java AWT Event Handler Thread genannt) und dem Thread, den Sie für den Thread starten, wechseln Kommunikation.

+1

Es gibt einige gute Ressourcen zum Thema: [Concurrency in Swing - Oracle] (https://docs.oracle.com/javase/tutorial/uiswing/Nebenläufigkeit), [Threading mit Schaukel] (http://www.javamex.com/tutorials/threads/invokelater.shtml) –

Verwandte Themen