gpt4 book ai didi

java - 通过java中的套接字连接同一网络上的两个系统时连接超时

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:26 25 4
gpt4 key购买 nike

我有一个代码,其中有 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");
}
}
}
}

最佳答案

我可以毫无问题地使用您的示例代码。某些本地防火墙规则可能会阻止您的客户端完成与服务器的连接。尝试在同一主机上运行客户端和服务器,在客户端连接中使用“localhost”或“127.0.0.1”。

查看Why would a "java.net.ConnectException: Connection timed out" exception occur when URL is up?中的最佳答案了解更多信息。

此外,我注意到您没有为连接或读取代码设置套接字超时。由于您没有在客户端套接字超时中设置超时,因此默认超时为零,这是永远的,或者更可能是无论您的操作系统默认套接字超时是什么。一般来说,特别是在生产代码中,不设置连接或读取的套接字超时是一个坏主意,因为这会导致资源消耗问题,从而备份整个系统。

尝试使用连接和读取超时设置客户端套接字,如下所示:

        //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());
...

关于java - 通过java中的套接字连接同一网络上的两个系统时连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com