![](/img/trans.png)
[英]Java Socket : java.net.SocketTimeoutException: Read timed out
[英]Java Socket Exception : java.net.SocketTimeoutException: Accept timed out
我必须在游戏中创建 IA。
为此,我必须将我连接到服务器,但我不能..
我会解释。 我的老师拿了我的 java 项目并执行 Launching.class。 在文件 Launching.java 和 Connection.java 中,我尝试在服务器上连接我。
当我的老师执行文件时,参数是:服务器上的server_name、port_number和map的大小(这里不重要)
我创建了一个本地服务器,一切都很好,但是当我发送我的文件并且当我的老师测试它时,他告诉我有一个错误:
Serveur : accept() du serveur pour le second joueur (n° 1) 不可能; java.net.SocketTimeoutException:接受超时
我想我的代码很简单,所以我寻求帮助。
为了连接我,我使用下面的两个文件“Launching.jaa”和“Connection.java”:
启动.java
public class Launching
{
private String addressIP;
private int port;
public Launching()
{
this.addressIP = "";
this.port = 0;
}
public void setAddressIP(String addressIP)
{
this.addressIP = addressIP;
}
public String getAddressIP()
{
return this.addressIP;
}
public void setPort(int port)
{
this.port = port;
}
public int getPort()
{
return this.port;
}
public static void main(String[] parameters) throws Exception
{
Launching parametersLaunching = new Launching();
parametersLaunching.addressIP = parameters[0];
parametersLaunching.port = Integer.parseInt(parameters[1]);
try
{
Connection connection = new Connection(parametersLaunching.addressIP, parametersLaunching.port);
connection.setInputStream(connection.getSocket());
connection.setOutputStream(connection.getSocket());
if(connection.getInputStream() != null && connection.getOutputStream() != null)
{
Game game = new Game(connection.getInputStream(), connection.getOutputStream(), Integer.parseInt(parameters[2]));
game.start();
}
if(connection.getInputStream() != null)
{
connection.getInputStream().close();
}
if(connection.getOutputStream() != null)
{
connection.getOutputStream().close();
}
if(connection.getSocket() != null)
{
connection.getSocket().close();
}
connection.getSocket().close();
}
catch(UnknownHostException exception)
{
exception.printStackTrace();
}
catch(IOException exception)
{
exception.printStackTrace();
}
}
}
连接.java
package network;
import java.io.*;
import java.net.*;
public class Connection
{
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public Connection(String adressIP, int port) throws Exception
{
InetAddress adress = InetAddress.getByName("adressIP");
this.socket = new Socket(adress, port);
this.inputStream = null;
this.outputStream = null;
}
public InputStream getInputStream()
{
return this.inputStream;
}
public OutputStream getOutputStream()
{
return this.outputStream;
}
public Socket getSocket()
{
return this.socket;
}
public void setInputStream(Socket socket) throws IOException
{
this.inputStream = socket.getInputStream();
}
public void setOutputStream(Socket socket) throws IOException
{
this.outputStream = socket.getOutputStream();
}
}
那么你有什么想法可以帮助我吗? 我想保留这种架构..
InetAddress adress = InetAddress.getByName("adressIP");
这总是将字符串"adressIP"
分配给"adressIP"
,而不是参数adressIP
。
如果服务器出现accept()
超时,则只能表示您连接失败,即 IP 地址或端口错误。
然而,还有许多其他问题。
Connection connection = new Connection(parametersLaunching.addressIP, parametersLaunching.port);
在这里,您(大概)正在创建一个连接到目标的客户端Socket
。
connection.setInputStream(connection.getSocket());
connection.setOutputStream(connection.getSocket());
所有这些都应该在Connection
的构造函数中发生。
if (connection.getInputStream() != null && connection.getOutputStream() != null)
这些测试毫无意义。 它们都不可能是假的。 套接字总是有输入和输出流,否则会抛出异常,大概你的Connection
类不会把它们扔掉。 不要写多余的代码。 消除。
Game game = new Game(connection.getInputStream(), connection.getOutputStream(), Integer.parseInt(parameters[2]));
在这里,您(大概)正在围绕Connection.
创建一个Thread
Connection.
game.start();
在这里,您开始线程。
if(connection.getInputStream() != null)
{
connection.getInputStream().close();
}
if(connection.getOutputStream() != null)
{
connection.getOutputStream().close();
}
if(connection.getSocket() != null)
{
connection.getSocket().close();
}
在这里,您正在阻止Game
运行,因为您正在关闭它的Socket
和它的两个流。 消除。 当它完成时,由Game
关闭它自己的套接字。 消除。
connection.getSocket().close();
在这里,您将第二次关闭Socket
。 消除。
NB 没有必要关闭所有这三个项目:只需要输出流就足够了。 关闭任一流将关闭另一个流和Socket
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.