Не могу подключиться к 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. Хотелось бы получить ответы на вопросы: Как подключиться к своему серверу? Вообще можно ли в Хероку подключаться через сокеты? Если можно, то что я делаю неправильно? Если нельзя, то какой сервис (желательно бесплатный, для тестов) можно использовать для этого? Заранее благодарю