我有一个代码,它有两个类,SocketDemo和ServerSocketDemo,当客户端(SocketDemon)试图连接到服务器(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");
}
}
}
}
我可以毫无问题地使用您的示例代码。可能是某些本地防火墙规则阻止您的客户端完成与服务器的连接。尝试在同一主机上运行客户端和服务器,在客户端连接中使用"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());
...