Как я могу сделать свой сервер Java доступным со всего мира? - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок во всех этих сетевых вещах. Я недавно работал над клиентом и сервером в Java. Клиент подключается к серверу так, как должен, а также получает ответ от сервера. Все работает нормально, пока клиент и сервер работают на компьютерах в одной сети. Когда я пытаюсь подключиться к серверу с компьютера, который не находится в той же сети, что и сервер, клиент просто не находит сервер.

Что я могу сделать, чтобы клиент мог подключиться к серверу из другой сети? И значит ли это, что я могу подключиться к серверу со всего мира?

Здесь вы можете найти код моего сервера:

    package zwei;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static int Port = 55571;

    static ServerSocket ServerSocket;
    static Socket ClientSocket;

    static PrintWriter out;
    static BufferedReader in;

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

    }


    static void handleConnection(int port) throws IOException {
        ServerSocket = new ServerSocket(port);
        System.out.println("Waiting for connections...");

        ClientSocket = ServerSocket.accept();
        System.out.println("Connected to Client!");

        out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
        in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));

        while(true) {
            try {
                    char[] buffer = new char[200];
                    int AnzahlZeichen = in.read(buffer, 0, 200);
                    String message = new String(buffer, 0, AnzahlZeichen);
                    System.out.println("[Client] " + message); 

                    out.print("Dear Client, I got your message! [ -" + message + "- ]");
                    out.flush();

                    if (message.equals("DISCONNECT")) {
                        System.out.println("Client disconnected");
                        ServerSocket.close();
                        ClientSocket.close();
                        handleConnection(Port);
                    }
                }
            catch(Exception e) {
                System.out.println("Client disconnected");
                ServerSocket.close();
                ClientSocket.close();
                handleConnection(Port);
            }

        }

    }

}

И здесь вы можете найти код клиента:

package zwei;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

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

public class Client extends JFrame{

    static int port = 55570;
    static String ServerAdress = ""; //Here I put the IP-Adress of the computer the server is running on

    static Socket ClientSocket;

    static PrintWriter out;
    static BufferedReader in;

    JTextField EnterMessage;
    JButton SendMessage;

    Client(){
         this.setLayout(null);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setVisible(true);
         this.setResizable(false);
         this.setSize(700, 700);
         //this.setTitle("Vokabeltrainer");

         EnterMessage = new JTextField();
         EnterMessage.setBounds(50, 50, 500, 50);
         this.add(EnterMessage);

         SendMessage = new JButton("send");
         SendMessage.setBounds(50, 150, 100, 100);
         SendMessage.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    SendMessageToServer(EnterMessage.getText());
                    ReceiveMessageFromServer();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            }});
         this.add(SendMessage);
    }

    private void connectToServer(String ServerAdress, int port) throws IOException {

        try {
            this.ClientSocket = new Socket(ServerAdress,port);
            System.out.println("Successfully established a connection to the server on port " + port + " .");
            }

        catch(Exception e) {
            System.out.println("An error occured while trying to connect to the server!");
            System.out.println("");
            e.printStackTrace();
        }
    }

    private void SendMessageToServer(String Nachricht) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
        out.print(Nachricht);
        out.flush();
    }

    private void ReceiveMessageFromServer() throws IOException{
        in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
        char[] buffer = new char[200];
        int AnzahlZeichen = in.read(buffer, 0, 200);
        String message = new String(buffer, 0, AnzahlZeichen);
        System.out.println("[Server] " + message); 
    }

    public static void main(String[] args) throws Exception { 
        Client client = new Client();
        client.connectToServer(ServerAdress, port);
        //in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));


    }

}

1 Ответ

0 голосов
/ 07 апреля 2020

Как вы знаете, у каждого компьютера есть IP-адрес и номер порта, а сервер - это тип компьютера. если вы хотите, чтобы ваше приложение работало, у вас должен быть сервер, который может запускать java, или, если вам просто нужен тест, у вас должен быть stati c ip для вашего компьютера. Таким образом, ваше клиентское приложение всегда знает, какой порт и какой IP-адрес следует использовать для подключения к вашему серверному приложению. Если вы хотите провести тестирование и не хотите платить за IP-адрес сервера или сервера c, укажите IP-адрес и порт от пользователя в клиентском приложении, и я думаю, что вы можете запускать свои приложения на 2 разных компьютерах, но стоит упомянуть, что настройки вашего рутера могут повлиять на ваше соединение.

...