2016-12-30 264 views
1

我試圖運行在Windows comman行代碼,並收到異常:在另一個命令行windwjava.net.ConnectException:連接被拒絕:連接發生

D:\dasi\java\javaLab>java ServerClient 
java.net.ConnectException: Connection refused: connect 
java.lang.StringIndexOutOfBoundsException: String index out of range: -2 

D:\dasi\java\javaLab> 

D:\dasi\java\javaLab>java SocketClient 
java.net.ConnectException: Connection timed out: connect 

D:\dasi\java\javaLab> 

服務器代碼:

import java.io.*; 
import java.net.*; 
public class ServerClient { 
    public ServerClient(int port) { 
     Server server = new Server(port); 
     server.start(); 
     Client client = new Client(port); 
     client.start(); 
    } 
    public static void main(String[] args) { 
     ServerClient s1 = new ServerClient(7777); 
    } 
} 

class Server extends Thread { 
    int port; 
    ServerSocket server; 
    Socket socket; 
    DataOutputStream outStream = null; 
    DataInputStream inStream = null; 
    public Server(int poort) { 
     try { 
      this.port = port; 
      server = new ServerSocket(port); 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 
    } 
    public void run() { 
     try { 
      socket = server.accept(); 
      outStream = new DataOutputStream(socket.getOutputStream()); 
      inStream = new DataInputStream(socket.getInputStream()); 
      System.out.println("server is ok, please continue!"); 
      while(true) { 
       String str = inStream.readUTF(); 
       System.out.println("The server receive String:"+str); 
       outStream.writeUTF(str); 
      } 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 
    } 
} 

class Client extends Thread { 
    int port; 
    Socket socket; 
    DataInputStream inStream = null; 
    DataOutputStream outStream = null; 
    public Client(int port) { 
     try { 
      this.port = port; 
      socket = new Socket(InetAddress.getLocalHost(),port); 
      inStream = new DataInputStream(socket.getInputStream()); 
      outStream = new DataOutputStream(socket.getOutputStream()); 
      System.out.println("client is ok, please continue!"); 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 
    } 
    public void run() { 
     try { 
      while(true) { 
       byte[] b = new byte[1024]; 
       String str = ""; 
       int m = System.in.read(b); 
       str = new String(b,0,0,m-1); 
       outStream.writeUTF(str); 
       str = inStream.readUTF(); 
       System.out.println("The client receive String:"+str); 
      } 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 
    } 
} 

客戶端代碼:

import java.net.*; 
import java.io.*; 
public class SocketClient { 
    Socket s = null; 
    DataInputStream inStream = null; 
    DataOutputStream outStream = null; 
    public SocketClient() { 
     try { 
      init(); 
      waitData(); 
     } 
     catch(Exception e) { 
      System.out.println(e.toString()); 
     } 
    } 
    void init() throws Exception { 
     s=new Socket("10.15.43.216",8765); 
     inStream = new DataInputStream(s.getInputStream()); 
     outStream = new DataOutputStream(s.getOutputStream()); 
     s.setSoTimeout(3000); 
    } 
    void waitData() { 
     while(true) { 
      try { 
       String str = inStream.readUTF(); 
       System.out.println("Client accept:" +str); 
       str = Integer.toString(Integer.parseInt(str)+1); 
       outStream.writeUTF(str); 
      } 
      catch(Exception e) { 
       System.out.println(e.toString()); 
       break; 
      } 
     } 
    } 
    public static void main(String[] args) { 
     new SocketClient(); 
    } 
} 

如果在我的代碼中存在任何錯誤,或者如果它是我的計算機端口導致問題,那麼我正在編程。因爲當我檢查我的計算機端口時,我沒有看到7777.當我發出命令netstat -nao |時findstr 7777,它什麼都沒有返回。

D:\dasi\java\javaLab>netstat -nao | findstr 7777 

D:\dasi\java\javaLab> 

如果是端口問題,那麼如何打開7777端口。 我是新手,請幫忙。非常感謝!

回答

1

更換

public Server(int poort) { 
    try { 
     this.port = port; 
     ... 
    } 
} 

public Server(int poort) { 
    try { 
     this.port = port; 
     ... 
    } 
} 

或者說端口的缺省值是零,那麼你的ServerSocket將0端口綁定,而不是7777

,並作爲該代碼段:

public ServerClient(int port) { 
    Server server = new Server(port); 
    server.start(); 
    Client client = new Client(port); 
    client.start(); 
} 

恐怕也很容易使你陷入困境,因爲我們不能保證服務器線程將前客戶線程執行,如果客戶線程執行時首先服務器還沒有運行它會導致錯誤。而且你已經在另一個java文件中有一個客戶端,所以我不能理解你爲什麼在這裏有一個客戶端。也許你可以刪除它們,代碼可以是這樣:

public ServerClient(int port) { 
    Server server = new Server(port); 
    server.start(); 
} 

客戶端代碼 服務器套接字是7777,所以你應該連接7777端口,而不是8765在你init方法也許代碼是這樣的:

void init() throws Exception { 
    s=new Socket(server name,7777); 
    ... 
} 
+0

謝謝,更改我的服務器代碼中的錯誤後,我現在可以運行它。但對於客戶端,我仍然收到連接超時異常。 – Lily

+0

將端口號8765更改爲7777後,仍然收到連接超時異常。 – Lily

+0

@Lily註釋's.setSoTimeout(3000);'在** init方法**中。或者相當於與 關聯的InputStream上的read()調用,此Socket將僅阻塞3000ms。如果超時 到期,則引發** java.net.SocketTimeoutException **。 –

相關問題