0

When I start program without tcp server, my program work correctly but when tcp server gets involved my second gui screen is not working. I am asking why do I have such a problem.How to make server ready.
This my ServerClass;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private ServerSocket serverSocket;

    public Server(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
    }

    public void startServer() {
        try {
            while (!serverSocket.isClosed()) {
                Socket socket = serverSocket.accept();
                System.out.println("Bağlandı");
                ClientHandler clientHandler = new ClientHandler(socket);

            }
        } catch (IOException e) {

        }
    }

    public static void main(String[] args) {
        
        Svg svg = new Svg();

        svg.getjBaslat().addActionListener(new ActionListener() {
            int rectNo;

            @Override
            public void actionPerformed(ActionEvent e) {
                
                    if (svg.getRectNo().getText().equals("")) {
                        rectNo = 0;
                    } else {
                        rectNo = Integer.parseInt(svg.getRectNo().getText());
                    }
                    svg.setVis();
                    
                    DrawShapes dShapes = new DrawShapes(rectNo);
                    
                    try {
                        ServerSocket serverSocket = new ServerSocket(9090);
                        Server server = new Server(serverSocket);
                        server.startServer();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }           
        });

    }
}

ClientHandler Class;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;

public class ClientHandler {

    public static ArrayList<ClientHandler> clientHandlers = new ArrayList<>();
    private Socket socket;
    private BufferedReader bufferedReader;
    private BufferedWriter bufferedWriter;
    
    public ClientHandler(Socket socket) {
        try {
            this.socket = socket;
            this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            clientHandlers.add(this);
        }catch (IOException e) {
            closeEverything(socket, bufferedReader, bufferedWriter);
        }
    }
    
    
    
    public void removeClientHandler() {
        clientHandlers.remove(this);
    }
    
    public void closeEverything(Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter) {
        removeClientHandler();
        try {
            if(bufferedReader != null) {
                bufferedReader.close();
            }if (bufferedWriter != null) {
                bufferedWriter.close();
            }if(socket != null) {
                socket.close();
            }
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
    
}

Gui1 Class;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Gui1 {
    
    private JFrame jFrame;
    private JLabel jRect;
    private JButton jStart;
    private JTextField rectNo;
    
    public Gui1() {
        jFrame = new JFrame("Title");
        jRect = new JLabel("Rect Number:");
        jStart = new JButton("Start");
        rectNo = new JTextField();
        
        jRect.setBounds(10, 10, 120, 30);
        jStart.setBounds(150, 40, 80, 25);
        rectNo.setBounds(150, 10, 80, 30);
        
        
        rectNo.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                String value = rectNo.getText();
                int i = value.length();
                if (e.getKeyChar() >= '0' && e.getKeyChar() <= '9') {
                    rectNo.setEditable(true);
                }else {
                    rectNo.setEditable(false);
                    rectNo.setText("");             }
            }
        });
        
        
        jFrame.add(jRect);
        jFrame.add(jStart);
        jFrame.add(rectNo);
        jFrame.setSize(250,125);
        jFrame.setLayout(null);
        jFrame.setDefaultCloseOperation(3);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
        
    }
    
    public JButton getjBaslat() {
        return jStart;
    }
    
    public JTextField getRectNo() {
        return rectNo;
    }
    
    public JFrame getjFrame() {
        return jFrame;
    }
    
    public void setVis() {
        if(jFrame.isVisible()) {
            jFrame.setVisible(false);
        }else {
            jFrame.setVisible(true);
        }
    }
}

DrawShapes Class;

import javax.swing.JFrame;

public class DrawShapes extends JFrame {
    private final static int GENISLIK = 800;
    private final static int YUKSEKLIK = 600;

    public DrawShapes(int x) {
        setSize(GENISLIK, YUKSEKLIK);
        setTitle("Sunucu");
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Panel panel = new Panel(x);
        add(panel);

        setVisible(true);
    }
}

Panel Class;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Panel extends JPanel implements ActionListener {
    private List<Object> sekil = new ArrayList<>();
    Timer timer;

    public Panel(int x) {
        this.setFocusable(true);
        timer = new Timer(20, this);
        timer.start();
        addRect(x);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        for (Object s : sekil) {
            if (s instanceof Rect) {
                ((Rect) s).paint(g);
            }
        }

    }

    public void update() {

        for (Object s : sekil) {
            if (s instanceof Rect) {
                ((Rect) s).update();
            }
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        update();

    }

    private void addRect(int i) {
        for (int a = 0; a < i; a++) {
            sekil.add(new Rect());
        }
    }

}

React Class;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class Rect {
    private final static int GENISLIK = 800;
    private final static int YUKSEKLIK = 600;
    private final static int eksi = 20;

    Random r = new Random();
    int x = r.nextInt(670);
    int y = r.nextInt(525);
    int genislik = (int) Math.floor(Math.random() * (70 - 20 + 1) + 20);
    int yukseklik = (int) Math.floor(Math.random() * (50 - 15 + 1) + 15);
    int adım = (int) Math.floor(Math.random() * (10 - 1 + 1) + 1);
    float f1 = r.nextFloat();
    float f2 = r.nextFloat() / 2f;
    float f3 = r.nextFloat() / 2f;

    public void paint(Graphics g) {
        Color rastgeleRenk = new Color(f1, f2, f3);
        g.setColor(rastgeleRenk);
        g.fillRect(x, y, genislik, yukseklik);
    }

    public void update() {
        if ((x + genislik) > (GENISLIK - eksi) || x < 0) {
            adım = -adım;
        }
        x = x + adım;
    }
}

I tried so many different ways to solve this problem but I can't see my fault. Maybe I made mistake thread section or made server connection false. I don't find any solution.
Thanks to all concerned.

ZpCikTi
  • 115
  • 1
  • 11
  • 2
    if you call ServerSocket.accept, that call blocks. That means the thread that it is running in won't run anything until somone connects. Networking stuff means you need to use threads for accepting new connections and reading from an inputstream. – f1sh Mar 25 '22 at 13:46
  • 1
    Your comment changed my perspective and I searched in different way. Actually there was an answer but I didn't find before that comment. Thank you @f1sh , This link answer of question: https://stackoverflow.com/questions/15541804/creating-the-serversocket-in-a-separate-thread – ZpCikTi Mar 25 '22 at 15:19

0 Answers0