Подключение клиентского приложения к моему серверу сделано в Java - PullRequest
0 голосов
/ 24 марта 2019

Несколько дней назад в универе мы сделали это простое клиент-серверное приложение. Приложение позволяет запрашивать информацию с сервера и получать ответ. Мы протестировали его на наших собственных машинах (localhost), а также протестировали их в локальной сети. Все работало нормально, и мы могли отправлять информацию с одного компьютера на другой в нашей локальной сети. Я хотел использовать приложение дома и общаться с другом. Проблема, с которой мы столкнулись, заключается в том, что мы не можем соединиться друг с другом, и мы всегда получаем ошибку тайм-аута соединения.

Мы пробовали разные вещи до сих пор:

  • Отключить брандмауэр
    • Разрешить Java в брандмауэре
    • пробовал разные порты
    • Пробовал разные клиент-серверные приложения, которые дают нам ту же самую проблему
    • Полностью изменены сети (подключены с разных роутеров) Мы используем внешний IP-адрес (не локальный) и можем пинговать адреса друг друга.

Вот код для сервера:


public class ServermultifilarTCP1 extends Thread {           
    private Scanner scanTCP;
    private PrintStream printTCP;
    private Socket socketTCP;
    private static Orar orar = new Orar();

    public ServermultifilarTCP1(Socket conexiuneTCP) throws IOException {
        this.socketTCP = conexiuneTCP;        // Obtinere socket
        this.scanTCP = new Scanner(socketTCP.getInputStream());
        this.printTCP = new PrintStream(socketTCP.getOutputStream());
    }

    public void run() {
        String mesaj;
        int zi;

        try {
             while(true) {
                if (scanTCP.hasNextLine()) {
                    mesaj = scanTCP.nextLine();
                    if (mesaj.equals("getOrar")) {
                        try {
                            zi = Integer.parseInt(scanTCP.nextLine());
                            String rezultat = orar.getOrar(zi);
                            printTCP.println(rezultat);
                        } catch (NumberFormatException ex) {
                            printTCP.println("Stop");
                            break;
                        }
                    }
                }
            }
            socketTCP.close();    // Inchiderea socketului si a fluxurilor
            JOptionPane.showMessageDialog(null, "Server: Bye!");
        } catch (IOException ex) {  ex.printStackTrace();   }
    }

    public static void main(String[] args) throws IOException {

        int portTCP = Integer.parseInt(JOptionPane.showInputDialog(

                         "Server: introduceti numarul de port al serverului"));

        ServerSocket serverTCP = new ServerSocket(portTCP); // Creare socket server

        while (true) {

            Socket conexiune = serverTCP.accept();

            ServermultifilarTCP1 server = new ServermultifilarTCP1(conexiune);

            server.start();

        }

    }

}

А вот класс клиента:

package pachetorar;



import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.net.*;

import java.io.*;

import java.util.*;



public class ClientTCP1 {

    private Scanner scanTCP;

    private PrintStream printTCP;

    private Socket socketTCP;

    private int portTCP;

    private InetAddress adresaIP;

    private JFrame frame;



    public ClientTCP1() throws IOException {     

        this.portTCP = Integer.parseInt(JOptionPane.showInputDialog(

                       "Client: introduceti numarul de port al serverului"));

        this.adresaIP = InetAddress.getByName(JOptionPane.showInputDialog(

                       "Client: introduceti adresa serverului"));

        this.socketTCP = new Socket(adresaIP, portTCP);        // Creare socket

        this.scanTCP = new Scanner(socketTCP.getInputStream());

        this.printTCP = new PrintStream(socketTCP.getOutputStream());



        JFrame frame = new JFrame("Client TCP");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container containerCurent = frame.getContentPane();

        containerCurent.setLayout(new BorderLayout());



        JPanel pane = new JPanel(new GridLayout(0, 1));

        final JLabel eticheta = new JLabel("Orarul zilei de:");

        pane.add(eticheta);



        final int numButtons = 8;

        final JRadioButton[] radioButtons = new JRadioButton[numButtons];

        final ButtonGroup group = new ButtonGroup();



        radioButtons[0] = new JRadioButton("Luni");

        radioButtons[0].setActionCommand("0");

        radioButtons[1] = new JRadioButton("Marti");

        radioButtons[1].setActionCommand("1");

        radioButtons[2] = new JRadioButton("Miercuri");

        radioButtons[2].setActionCommand("2");

        radioButtons[3] = new JRadioButton("Joi");

        radioButtons[3].setActionCommand("3");

        radioButtons[4] = new JRadioButton("Vineri");

        radioButtons[4].setActionCommand("4");

        radioButtons[5] = new JRadioButton("Sambata");

        radioButtons[5].setActionCommand("5");

        radioButtons[6] = new JRadioButton("Duminica");

        radioButtons[6].setActionCommand("6");

        radioButtons[7] = new JRadioButton("Stop");

        radioButtons[7].setActionCommand("Stop");

        radioButtons[0].setSelected(true);



        for (int i = 0; i < numButtons; i++) {

            group.add(radioButtons[i]);

            pane.add(radioButtons[i]);

        }

        containerCurent.add(pane, BorderLayout.WEST);



        JButton sendButton = new JButton("Trimite");



        sendButton.addActionListener(new ActionListener() {

            // trimiterea catre server a cererii de efectuare a serviciului

            public void actionPerformed(ActionEvent e) {

                String service = "getOrar";

                printTCP.println(service);

                String command = group.getSelection().getActionCommand();

                printTCP.println(command);

            }

        });

        containerCurent.add(sendButton, BorderLayout.NORTH);



        final JTextArea outGrafic = new JTextArea(8, 40); // Zona non-editabila

        JScrollPane scrollPane = new JScrollPane(outGrafic,

                     JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

                     JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        outGrafic.setEditable(false);

        containerCurent.add(outGrafic, BorderLayout.CENTER);

        frame.pack(); frame.setVisible(true);



        String mesaj;

        while(true) {                     // afisarea raspunsului primit de la server

            if (scanTCP.hasNextLine()) {

                mesaj = scanTCP.nextLine();

                outGrafic.setText(outGrafic.getText() + mesaj + "\n");

                if (mesaj.equals("Stop")) System.exit(0);  // Conditie oprire

            }

        }

    }

    public static void main(String[] args) throws IOException {

        ClientTCP1 client = new ClientTCP1();

    }
}

Вот класс, используемый классом сервера, но он не имеет отношения к проблеме, я думаю:

package pachetorar; public class Orar {

    private String[] orar; // camp ascuns (starea obiectului)



    public Orar() {

        orar = new String[7]; // alocarea dinamica a spatiului pentru tablou

        // popularea tabloului cu valori

        orar[0] = "Luni este curs TPI la seriile D si E " +

                                "si laborator TPI la seria E.";

        orar[1] = "Marti nu sunt ore de TPI.";

        orar[2] = "Miercuri este laborator TPI la seriile D si E.";

        orar[3] = "Joi este laborator TPI la seria D.";

        orar[4] = "Vineri este laborator TPI la seria D.";

        orar[5] = "Sambata nu sunt ore de TPI.";

        orar[6] = "Duminica nu sunt ore de TPI.";

    }

    public String getOrar(int zi) { // metoda accesor - getter

        return orar[zi];            // returneaza un element al tabloului

    }

    public void setOrar(int zi, String text) { // metoda accesor - setter

        orar[zi] = text;                       // inlocuieste un element

    }

}

Желаемым результатом должно быть установление соединения между двумя компьютерами, а не получение ошибки тайм-аута соединения. Если клиент не может связаться с сервером, графический интерфейс не будет отображаться, и я получу ошибку, упомянутую выше.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Скорее всего, вам нужно открыть порт, а затем перенести порт в настройках вашего маршрутизатора. Это говорит вашему маршрутизатору, что любое соединение, поступающее через выбранный вами порт, должно перенаправляться на ваш компьютер.

Например, если я открою порт x, а затем перенаправлю его на локальный IP-адрес моего компьютера, любое входящее соединение с моим общедоступным IP-адресом через порт x будет перенаправлено в приложение, работающее на этом порту на моем компьютере.

0 голосов
/ 24 марта 2019

Поскольку ваши компьютеры находятся за NAT, вы не можете получить доступ к компьютеру вашего друга напрямую. Вы должны использовать Обход транслятора сетевых адресов или перенаправление портов . Или оба компьютера должны быть в одной физической сети (вы также можете использовать VPN).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...