Тайм-аут соединения при соединении двух систем в одной сети через сокеты в Java

У меня есть код, который имеет 2 класса, SocketDemo и ServerSocketDemo, когда клиент (SocketDemo) пытается подключиться к серверу (ServerSocketDemo), он ждет несколько секунд, а затем выдает

java.net.ConnectionException: истекло время ожидания соединения

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

Сначала скажите, возможно ли соединить две разные системы через одно и то же соединение?

Пожалуйста, рассмотрите этот фрагмент кода и помогите!

Код клиента

import java.net.*;
import java.io.*;
class SocketDemo
{
    public static void main(String...arga) throws Exception
    {
        Socket          s = null;
        PrintWriter    pw = null;
        BufferedReader br = null;
        System.out.println("Enter a number one digit");
        int i=(System.in.read()-48); // will read only one character
        System.out.println("Input number is "+i);
        try
        {
            s  = new Socket("192.168.1.5",40000);
            System.out.println(s);
            pw = new PrintWriter(s.getOutputStream());
            System.out.println(pw);
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            System.out.println(br);
            System.out.println("Connection established, streams created");
        }
        catch(Exception e)
        {
            System.out.println("Exception in Client "+e);
        }
        pw.println(i);
        pw.flush();
        System.out.println("Data sent to server");
        String str = br.readLine();
        System.out.println("The square of "+i+" is "+str);
    }
}

Код сервера:

import java.io.*;
import java.net.*;
class ServerSocketDemo
{
    public static void main(String...args)
    {
        ServerSocket ss=null;
        PrintWriter    pw = null;
        BufferedReader br = null;
        int i=0;
        try
        {
            ss = new ServerSocket(40000);
        }
        catch(Exception e)
        {
            System.out.println("Exception in Server while creating connection"+e);
            e.printStackTrace();
        }
        System.out.print("Server is ready");
        while (true)
        {
            System.out.println ("  Waiting for connection....");
            Socket s=null;
            try
            {
                System.out.println("connection "+s+ "\n printwriter "+pw+"\n bufferedreader "+br);
                s = ss.accept();
                System.out.println("Connection established with client");
                pw = new PrintWriter(s.getOutputStream());
                br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                System.out.println("connection "+s+ "\n printwriter "+pw+"\n bufferedreader "+br);
                i = new Integer(br.readLine());
                System.out.println("i is "+i);
            }
            catch(Exception e)
            {
                System.out.println("Exception in Server "+e);
                e.printStackTrace();
            }
            System.out.println("Connection established with "+s);
            i*=i;
            pw.println(i);
            try
            {
                pw.close();
                br.close();
            }
            catch(Exception e)
            {
                System.out.println("Exception while closing streams");
            }
        }
    }
}

1 ответ

Решение

Я могу использовать ваш пример кода без проблем. Вероятно, какое-то локальное правило брандмауэра не позволяет вашему клиенту завершить соединение с сервером. Попробуйте запустить клиент и сервер на одном хосте, используя localhost или 127.0.0.1 в клиентском соединении.

См. Верхний ответ в разделе Почему возникла исключительная ситуация "java.net.ConnectException: Время ожидания соединения истекло", когда URL-адрес активен? для получения дополнительной информации.

Кроме того, я отмечаю, что вы не устанавливаете таймауты сокетов для соединений или чтения в вашем коде. Так как вы не устанавливаете тайм-аут в тайм-ауте вашего клиентского сокета, тайм-аут по умолчанию равен нулю, что навсегда, или, скорее всего, независимо от того, какой тайм-аут по умолчанию установлен в вашей ОС. В целом, и особенно в производственном коде, установка тайм-аута сокета для соединения или чтения является плохой идеей, поскольку это приведет к проблемам с потреблением ресурсов, что приведет к резервному копированию всей системы.

Попробуйте настроить клиентский сокет с подключением и прочитать тайм-аут, например:

        //use a SocketAddress so you can set connect timeouts
        InetSocketAddress sockAddress = new InetSocketAddress("127.0.0.1",40000);
        s  = new Socket();
        //set connect timeout to one minute
        s.connect(sockAddress, 60000);
        //set read timeout to one minute
        s.setSoTimeout(60000);            
        System.out.println(s);
        pw = new PrintWriter(s.getOutputStream());
        ...
Другие вопросы по тегам