【问题标题】:Java Socket Exception : java.net.SocketTimeoutException: Accept timed outJava 套接字异常:java.net.SocketTimeoutException:接受超时
【发布时间】:2015-10-21 09:24:55
【问题描述】:

我必须在游戏上创建 IA。

为此,我必须将我连接到服务器,但我不能..

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

当我的老师执行文件时,参数是:server_name,服务器上的端口号和地图的大小(这里不重要)

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

Serveur : accept() du serverur 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();
    }   
}

那么你有什么想法可以帮助我吗?我想保留这个架构..

【问题讨论】:

  • “我创建了一个本地服务器”但是你还没有发布。
  • 因为它非常糟糕.. 很棒的服务器是我老师的服务器,但我们无法获得代码。我想我发现了我的错误.. 在 Connection.java 中: InetAddress adress = InetAddress.getByName("adressIP");我认为是:InetAddress adress = InetAddress.getByName(adressIP);我会再次测试它,如果一切都好,我会说你;)

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


【解决方案1】:
InetAddress adress = InetAddress.getByName("adressIP");

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

【讨论】:

  • 非常感谢!我很愚蠢..我会再次测试它并说你是否一切都好! :D 但是再次感谢! :)
【解决方案2】:

如果服务器收到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

 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

【讨论】:

  • 非常感谢您的帮助! :) 我会检查我的代码啊!
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2012-10-24
  • 2019-10-21
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多