Java Socket异常:java.net.SocketTimeoutException:接受超时

时间:2015-10-21 09:24:55

标签: java sockets exception network-programming artificial-intelligence

我很抱歉,但我不会说英语.. :)

我必须在游戏中创建IA,我必须在5小时内将它交给我的老师。

要做到这一点,我必须将我连接到服务器,但我不能..

我会解释。我的老师拿了我的java项目并执行Launching.class。 在文件Launching.java和Connection.java中,我尝试在服务器上连接我。

当我的主人执行文件时,参数是:server_name,服务器上的port_number和地图的大小(这里不重要)

我创建了一个本地服务器,一切都很好但是当我发送文件时,当我的老师测试它时,他发给我一个错误:

  

Serveur:接受()du serveur pour le second joueur(n°1)不可能; java.net.SocketTimeoutException:接受超时

我认为我的代码很简单,所以我请求帮助。

要连接我,我在下面使用两个文件“Launching.jaa”和“Connection.java”:

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

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

你有什么想法帮助我吗?我想保留这种架构..

非常感谢你的帮助! :)

2 个答案:

答案 0 :(得分:0)

InetAddress adress = InetAddress.getByName("adressIP");

这总是将字符串"adressIP"分配给地址,而不是参数adressIP

答案 1 :(得分:0)

如果服务器有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]));

您可能(大概)在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。删除。

注意:没有必要关闭所有这三个项目:输出流就足够了。关闭任一流将关闭另一个和Socket