Не могу подключиться к Java серверу в Heroku

Я осуществил сервер на Java, используя подключение через сокеты

Server.java (Залит на heroku):

import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;

public class Server implements TCPConnectionListener{

    public static void main(String[] args){
        new Server();
    }

    private final ArrayList<TCPConnection> connections = new ArrayList<>();

    private Server(){
        System.out.println("Старт сервера...");
        try(ServerSocket serverSocket = new ServerSocket(6969)){
            while (true){
                try{
                    new TCPConnection(this, serverSocket.accept());
                }catch (IOException e){
                    System.out.println("Ошибка подключения: " + e);
                }
            }
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }

    @Override
    public synchronized void onConnectionReady(TCPConnection tcpConnection) {
        connections.add(tcpConnection);
        sendToAllConnections(String.format("Клиент %s подключён", tcpConnection));
    }

    @Override
    public synchronized void onReceiveString(TCPConnection tcpConnection, String value) {
        sendToAllConnections(value);
    }

    @Override
    public synchronized void onDisconnect(TCPConnection tcpConnection) {
        connections.remove(tcpConnection);
        sendToAllConnections(String.format("Клиент %s отключён", tcpConnection));
    }

    @Override
    public synchronized void onException(TCPConnection tcpConnection, Exception e) {
        System.out.println("Ошибка: " + e);
    }

    private void sendToAllConnections(String value){
        System.out.println("Всем:" + value);
        for (TCPConnection connection : connections) connection.sendString(value);
    }
}

TCPConnection.java (Залит на heroku):

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TCPConnection {
    private final Socket socket;
    private final Thread thread;
    private final BufferedReader in;
    private final BufferedWriter out;
    private final TCPConnectionListener eventListener;

    public TCPConnection(TCPConnectionListener eventListener, String ip, int port) throws IOException{
        this(eventListener, new Socket(ip, port));
    }

    public TCPConnection(TCPConnectionListener connectionListener, Socket socket) throws IOException {
        this.eventListener = connectionListener;
        this.socket = socket;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8));
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    eventListener.onConnectionReady(TCPConnection.this);
                    while (!thread.isInterrupted()){
                        eventListener.onReceiveString(TCPConnection.this, in.readLine());
                    }
                } catch (IOException e) {
                    eventListener.onException(TCPConnection.this, e);
                } finally {
                    eventListener.onDisconnect(TCPConnection.this);
                }
            }
        });
        thread.start();
    }

    public synchronized void sendString(String value){
        try {
            out.write(value + "\r\n");
            out.flush();
        } catch (IOException e) {
            eventListener.onException(TCPConnection.this, e);
            disconnect();
        }
    }

    public synchronized void disconnect(){
        thread.interrupt();
        try {
            socket.close();
        } catch (IOException e) {
            eventListener.onException(TCPConnection.this, e);
        }
    }

    @Override
    public String toString() {
        return "TCPConnection: " + socket.getInetAddress() + ":" + socket.getPort();
    }
}

TCPConnectionListener.java (Залит на heroku):

public interface TCPConnectionListener {
    void onConnectionReady(TCPConnection tcpConnection);
    void onReceiveString(TCPConnection tcpConnection, String value);
    void onDisconnect(TCPConnection tcpConnection);
    void onException(TCPConnection tcpConnection, Exception e);
}

Client.java (Находится на компьютере):

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client implements TCPConnectionListener{
    private static String IP;

    static {
        try {
            IP = String.valueOf(InetAddress.getByName("floating-fortress-13537.herokuapp.com"));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

    private static final int PORT = 6969;
    private TCPConnection connection;

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                new Client().connect();
            }
        }).start();
    }

    private void connect(){
        Scanner in = new Scanner(System.in);
        try {
            connection = new TCPConnection(this, IP, PORT);
            while (true) {
                String msg = in.nextLine();
                connection.sendString(msg);
            }
        } catch (IOException e) {
            printMsg("Connection exception: " + e);
        }
    }

    @Override
    public void onConnectionReady(TCPConnection tcpConnection) {
        printMsg("Connection ready...");
    }

    @Override
    public void onReceiveString(TCPConnection tcpConnection, String value) {
        printMsg(value);
    }

    @Override
    public void onDisconnect(TCPConnection tcpConnection) {
        printMsg("Connection closed");
    }

    @Override
    public void onException(TCPConnection tcpConnection, Exception e) {
        printMsg("Connection exception: " + e);
    }

    private void printMsg(String msg){
        System.out.println(msg + "\n");
    }
}

Сами логи heroku:

2021-01-03T19:06:38.226265+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=6969 -cp target/classes/:target/dependency/* ru.romatopotato.Server`
2021-01-03T19:06:40.825920+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2021-01-03T19:06:40.831870+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 
2021-01-03T19:06:41.062579+00:00 app[web.1]: Старт сервера...
2021-01-03T19:06:42.608269+00:00 heroku[web.1]: State changed from starting to up
2021-01-03T19:06:42.596129+00:00 app[web.1]: Клиент /10.109.150.111: 48221 подключён
2021-01-03T19:06:42.596806+00:00 app[web.1]: Ошибка: java.net.SocketException: Broken pipe (Write failed)
2021-01-03T19:06:42.597172+00:00 app[web.1]: Клиент /10.109.150.111: 48221 отключён
2021-01-03T19:06:42.599599+00:00 app[web.1]: Клиент /172.19.96.17: 48199 подключён
2021-01-03T19:06:42.599942+00:00 app[web.1]: Ошибка: java.net.SocketException: Broken pipe (Write failed)
2021-01-03T19:06:42.600196+00:00 app[web.1]: Клиент /172.19.96.17: 48199 отключён

Весь код слизан с просторов Интернета дабы понять работу сокетов. При этом сам Client.java я не запускаю, хотя логи показывают, будто кто-то подключается.

Но при попытке подключения к серверу самому (Запуска Client.java с компьютера) выскакивает исключение:

Connection exception: java.net.UnknownHostException: floating-fortress-13537.herokuapp.com/3.224.58.229

Где floating-fortress-13537.herokuapp.com - адрес моего приложения в heroku. Хотелось бы получить ответы на вопросы: Как подключиться к своему серверу? Вообще можно ли в Хероку подключаться через сокеты? Если можно, то что я делаю неправильно? Если нельзя, то какой сервис (желательно бесплатный, для тестов) можно использовать для этого? Заранее благодарю


Ответы (0 шт):