Тайм-аут соединения при соединении двух систем в одной сети через сокеты в 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());
...