Чем вызвана данная ошибка(TCP socket)?

145
27 марта 2019, 10:20

Никак не могу понять в чем дело. Пересмотрел кучу всего на эту тему, но мало чего помогло. Ошибка звучит так: [DEBUG] 2018-11-03 23:48:06.222 [main] TCP - В соединении отказано (Connection refused). Вот кусок кода, выдающий данную ошибку:

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import org.apache.logging.log4j.*;
public class TCP {
    private static int number_of_socket = 6666;
    public static void main(String[] args) {
        Logger log = LogManager.getLogger(TCP.class.getName());
        try {
            InetAddress ipAddress = InetAddress.getByName("localhost");
            try (Socket socket = new Socket(ipAddress, number_of_socket)) {
                Client cl = new Client("Vasya", socket);
                Server sever = new Server(socket);
            } catch (IOException ex) {
                log.debug(ex.getLocalizedMessage());
            }
        }catch (UnknownHostException ex) {
                log.debug(ex.getCause());
        }
    }
}

И так для любого свободного порта, который я выбираю. Код сервера, клиента, и вспомогательного класса-обертки: Сервер:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import org.apache.logging.log4j.*;
public class Server extends Thread{
    private ServerSocket serverSocket;
    private LinkedList<MyWrapper> wrap;
    private Logger log = LogManager.getLogger(Server.class.getName());
    public Server (Socket socket){
        try {
            wrap = new LinkedList<MyWrapper>();
            serverSocket = new ServerSocket(6666);
            start();
        }catch(IOException ex){
            log.debug(ex.getMessage());
        }
    }
    @Override
    public void run(){
        while (true){
           try {
               try {
                   Socket sc = serverSocket.accept();
                   wrap.add(new MyWrapper(sc, wrap));
               } catch (IOException ex) {
                   log.debug(ex.getMessage());
               } finally {
                   serverSocket.close();
               }
           }catch (IOException ex){
               log.debug(ex.getMessage());
           }
        }
    }
}

Клиент:

 import java.io.*;
    import java.net.Socket;
    import org.apache.logging.log4j.*;
    public class Client extends Thread {
        private String name;
private Socket socket;
        private PrintWriter out;
        private BufferedReader in;
        private Logger log = LogManager.getLogger(Client.class.getName());
        public Client(String name, Socket socket){
            this.name = name;
            try {
                this.socket = socket;
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            }catch (IOException ex){
                log.debug(ex.getMessage());
            }
            start();
        }
        @Override
        public synchronized void run(){
            Read_Client read_client = new Read_Client(in);
            Write_Client write_client = new Write_Client(out, name);
        }
    }
Обертка:
    import java.io.*;
    import java.net.Socket;
    import java.util.LinkedList;
    import org.apache.logging.log4j.*;

public class MyWrapper extends Thread {
        private BufferedReader in;
        private PrintWriter out;
        private String name;
        private Socket mySocket;
        private  LinkedList<MyWrapper> chatMembers;
        private Logger log = LogManager.getLogger(Server.class.getName());
        public MyWrapper (Socket socket , LinkedList<MyWrapper> wrap) throws IOException{
            name = "noname";
            mySocket = socket;
            chatMembers = wrap;
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            start();
        }
        @Override
        public void run(){
            while (true){
                try {
                    String message = in.readLine();
                    if (message.equals("@quit")){
                        for (MyWrapper mr : chatMembers){
                            if (!mr.name.equals(this.name))
                            mr.write(name + "has gone");
                            else mr.write("@quit");
                        }
                        break;
                    }
                    if (message.substring(0,9).equals("@senduser ")){
                        String receiver_name = message.substring(10);
                        for (MyWrapper mr : chatMembers) {
                            if (mr.name.equals(receiver_name))
                                mr.write(name + ": " + message);
                        }
                    }
                    if (message.charAt(0) == '@' && name.equals("noname")){
                        name = name = message.substring(1);
                    }else if (message.charAt(0) != '@'){
                        for (MyWrapper mr : chatMembers) {
                            mr.write(name + ": " + message);
                        }
                    }
                }catch(IOException ex){
                    log.debug(ex.getMessage());
                }
            }
        }
        private void write(String message) throws IOException{
                out.write(message);
        }
    }

Ну и stacktrace наконец:

java.net.ConnectException: В соединении отказано (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
    at java.base/java.net.Socket.connect(Socket.java:591)
    at java.base/java.net.Socket.connect(Socket.java:540)
    at java.base/java.net.Socket.<init>(Socket.java:436)
    at java.base/java.net.Socket.<init>(Socket.java:213)
    at tcp.TCP.main(TCP.java:21)
Answer 1

К сожалению, Ваш вопрос не содержит необходимой для ответа информации. Огромная просьба приложить код классов Client и Server. Без этого кода непонятно, как реализовано соединение. Но если предположить, что в сервере используется метод ServerSocket.accept, а в клиенте Socket.connect, то следовало бы для начала инициализировать сервер, прослушивающий соединения, а уже после клиент, который к этому самому серверу и подключится.

Более правильный код будет выглядеть так:

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Logging;
public class TCP {
    private static int number_of_socket = 6666;
    public static void main(String[] args) {
        Logger log = Logger.getLogger(TCP.class.getName());
        try {
            InetAddress ipAddress = InetAddress.getLocalHost();
            try (Socket socket = new Socket(ipAddress, number_of_socket)) {
                Server sever = new Server(socket);
                Client cl = new Client("Vasya", socket);
            } catch (IOException ex) {
                log.fatal("Ошибка соединения!", ex);
            }
        } catch (UnknownHostException ex) {
            log.fatal("Невозможно обнаружить хост.", ex);
        }
    }
}
READ ALSO
Glide время истечение годности кеша

Glide время истечение годности кеша

В своем андроид приложении для загрузки изображений(gif) использую glide

226
Как заменить иконкой FontAwesome input?

Как заменить иконкой FontAwesome input?

Всем привет! Код HTML:

176
Удаление тега при загрузки страницы на малых экранах

Удаление тега при загрузки страницы на малых экранах

нужна помощь, нужно удалить полностью тег при загрузки станицы, пример такой, необходимо удалить <section class="page4"> из станицы,

172