Im Erstellen eines Client/Server-Programms. Clients müssen sich mit einem Server verbinden, der mit einer Schnittstelle verbunden ist und alle 5 Minuten senden Clients einen String, der in der Server-Oberfläche angezeigt wird. Dies ist der Schnittstelle Server Code:Schnittstelle Einfrieren nach Serverstart
public class MainServer implements ActionListener {
public static JFrame f_principale;
JButton avvio_server;
JButton ferma_server;
public static JLabel risultato;
JButton richiesta;
Server server;
public static JTextArea ritorni;
public MainServer(){
UI_LOADER();
}
public void BUTTON_LOADER(){
avvio_server = new JButton("Avvia");
ferma_server = new JButton("Ferma");
richiesta = new JButton("Richiedi");
avvio_server.addActionListener(this);
ferma_server.addActionListener(this);
richiesta.addActionListener(this);
}
public void TEXT_LOADER(){
risultato = new JLabel();
risultato.setText("prova");
ritorni = new JTextArea();
}
public void WINDOW_LOADER(){
f_principale = new JFrame("Centro Meteorologica");
f_principale.setSize(800, 600);
f_principale.setVisible(true);
f_principale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f_principale.setBackground(Color.gray);
f_principale.add(avvio_server);
f_principale.add(ferma_server);
f_principale.add(richiesta);
f_principale.add(ritorni);
f_principale.add(risultato);
avvio_server.setBounds(100, 400, 200, 100);
ferma_server.setBounds(500, 400, 200, 100);
richiesta.setBounds(350, 400, 100, 50);
ritorni.setBounds(100, 50, 600, 300);
risultato.setBounds(300, 530, 200, 50);
}
public void UI_LOADER(){
BUTTON_LOADER();
TEXT_LOADER();
WINDOW_LOADER();
}
public static void main(String[] args) {
MainServer m1 = new MainServer();
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
if(button.getText() == "Avvia"){
System.out.print("Server avviato");
Thread server = new Server();
System.out.print("Server avviato");
server.run();
System.out.print("Server avviato");
}
if(button.getText() == "Ferma"){
try {
server.closeServer();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if(button.getText() == "Richiedi"){
}
}
Und dies ist der Code Server:
public class Server extends Thread{
private ServerSocket serverSocket;
int clientPort;
ArrayList clients = new ArrayList();
public void run(){
Socket client;
try {
MainServer.ritorni.setText("Server Aperto");
serverSocket= new ServerSocket(4500);
System.out.println("Server Aperto");
} catch (IOException e) {
MainServer.risultato.setText("Errore nel aprire il server");
}
while(true){
client = null;
try {
client=serverSocket.accept();
MainServer.risultato.setText("Dispositivo collegato");
} catch (IOException e) {
MainServer.risultato.setText("Errore nel collegare il dispositivo");
}
clients.add(client);
Thread t=new Thread(new AscoltoDispositivo(client));
t.start();
}
}
public void closeServer() throws IOException{
serverSocket.close();
}
public void broadcastMessage(BufferedReader is, DataOutputStream os, Socket client) throws IOException{
for(Iterator all=clients.iterator();all.hasNext();){
Socket cl=(Socket)all.next();
sendMessage(cl);
}
}
private void sendMessage(Socket cl) throws IOException{
new DataOutputStream(cl.getOutputStream()).writeBytes("ASKRESPONSE");
}
}
class AscoltoDispositivo implements Runnable{
DataOutputStream os;
BufferedReader is;
Socket client;
static String tempReceived = null;
public AscoltoDispositivo(Socket client){
this.client=client;
try{
is= new BufferedReader(new InputStreamReader(client.getInputStream()));
os= new DataOutputStream (client.getOutputStream());
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
try {
tempReceived = is.readLine();
MainServer.ritorni.append(tempReceived);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
mein einziges Problem ist, dass die Schnittstelle, nachdem ich den Startknopf klicken Sie frieren.
Die 'while (true)' ist keine gute Praxis. Versuchen Sie auch, einen Timer in dieser Schleife hinzuzufügen ('Thread.sleep()' zum Beispiel) –
Das Problem ist, dass die Schnittstelle irgendwie mit dem Server verbunden ist, aber ich habe es als Thread festgelegt. –