1

我很抱歉,但我不會說英語非常好.. :)Java Socket技術異常:java.net.SocketTimeoutException:接受超時

我一定要在遊戲創建一個IA,我必須給它在5小時給我的老師。

要做到這一點,我必須我連接到服務器,但我不能..

我會解釋。我的老師拿我的java項目並執行Launching.class。 在文件Launching.java和Connection.java中,我嘗試在服務器上連接我。

當我theacher執行文件,參數爲:服務器名稱,端口號的地圖(在這裏並不重要)

我創建了一個本地服務器,一切都很好,但是當我把我的文件時的服務器和尺寸上我的老師測試它,他給我發現有一個錯誤:

Serveur:accept()du serveur pour le second joueur(n°1)impossible; 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(); 
    } 
} 

那麼你有想法來幫助我嗎?我想保持這種架構..

坦克你非常需要你的幫助! :)

+0

「我創建了本地服務器」,但您還沒有發佈它。 – EJP

+0

因爲它很糟糕..偉大的服務器是我老師的服務器,但我們不能擁有代碼。 我想我找到了我的錯誤.. 在Connection.java中:InetAddress adress = InetAddress.getByName(「adressIP」); 我認爲它是:InetAddress地址= InetAddress.getByName(adressIP); 我會再次測試,我會說如果一切都很好;) –

回答

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

這始終將字符串"adressIP"到ADRESS代替參數adressIP

+0

非常感謝!我很蠢.. 我會再次測試,並說如果一切都很好! :D 但是再次感謝! :) –

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])); 

這裏你(大概)周圍產生Connection.

game.start(); 

這裏一個Thread要啓動線程。

if(connection.getInputStream() != null) 
{ 
    connection.getInputStream().close(); 
} 
if(connection.getOutputStream() != null) 
{ 
    connection.getOutputStream().close(); 
} 
if(connection.getSocket() != null) 
{ 
    connection.getSocket().close(); 
} 

這裏你防止Game從不斷運行,因爲你是關閉其Socket和它的兩個流。去掉。當它完成後,它將自動關閉自己的套接字。去掉。

connection.getSocket().close(); 

在這裏,您要關閉Socket第二次。去掉。

注意:沒有必要關閉所有這三個項目:只要輸出流就足夠了。關閉其中一個流會關閉另一個流並關閉Socket

+0

非常感謝您的幫助! :) 我會檢查我的代碼啊! –