0

我試圖創建一個客戶端/服務器連接,並且對於java仍然很新。所以我得到的錯誤告訴我,套接字已關閉。經過一番努力,我已經設法編寫了下面給出的代碼。我相信如果我必須猜測,將套接字傳遞給連接類的方式有問題,導致套接字對象可能被關閉?java.net.SocketException:在Socket.accept()和Socket.getInputStream()之間關閉Socket

我試過添加等待,以防萬一服務器線程沒有被執行,但似乎沒有影響任何東西。也許我應該在自己的命令提示符下使用自己的啓動器啓動服務器,但是我認爲這應該很好地測試客戶端和服務器。

我似乎無法找到爲什麼我的套接字在我發送消息之前關閉。任何見解將不勝感激!

謝謝!

錯誤
java.net.SocketException: Socket is closed 
    at java.net.Socket.getInputSTream(Unknown Source) 
    at Connection.run(Connection.java:17) 

Server.java
//main calling snippet. 
import java.lang.Thread; 

public class Server { 
    public static void main(String[] args) { 
     if(args.length != 1) { 
      System.err.println("Usage: java Server <port number>"); 
      System.exit(1); 
     } 

     int port = Integer.parseInt(args[0]); 
     Thread server = new KServer(port); 
     server.start(); 
     //added waits just to make sure the thread was executed? 
     //thinking this might be my problem 
     long t = System.currentTimeMillis() + 5000; 
     while (System.currentTimeMillis() < t) { 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     KClient client = new KClient("127.0.0.1",port); 
     while (!(client.openConn())) { 
      System.out.println("Failed to connect. Retrying..."); 
     } 
     client.send("Hello World"); 
     client.closeConn(); 

    } 
} 

KServer.java
//the actual server class that manages listening and threading the sockets 
import java.net.*; 
import java.io.*; 

public class KServer extends Thread { 

    private int port; 
    private ServerSocket sSock; 

    public KServer(int thisPort) { 
     port = thisPort; 
     try { 
      sSock = new ServerSocket(port); 
     } catch (IOException e) { 
      e.printStackTrace();    
     } 
    } 

    public void run() { 
     while(true) { 
      try (Socket cSock = sSock.accept();) { 
       Thread con = new Connection(cSock); 
       con.start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

Connection.java
//Manages sending and receiving messages 

import java.net.Socket; 
import java.io.*; 

public class Connection extends Thread { 

    Socket socket; 

    public Connection(Socket s) { 
     socket = s; 
    } 

    public void run() {  
     String msg; 
     BufferedReader in; 
     try { 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      while((msg = in.readLine()) != null) { 
       System.out.println(msg); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

KClient.java

//manages the clients connection life to the server 
import java.net.*; 
import java.io.*; 

public class KClient { 

    private Socket sock; 
    private String dest; 
    private int port; 

    private OutputStreamWriter out; 

    public KClient(String dst,int prt) { 
     dest = dst; 
     port = prt; 
    } 

    public boolean openConn() { 

     try { 
      sock = new Socket(dest,port); 
      out = new OutputStreamWriter(sock.getOutputStream(),"ISO-8859-1");   
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 

     } 
     return true; 
    } 

    public void send(String msg) { 
     try { 
      out.write(msg); 
      out.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void closeConn() { 

     try { 
      out.flush(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 



} 

回答

3

不要使用try-with-resources來接受套接字。它將關閉接受的套接字,該套接字需要保持打開狀態,以便處理線程可以使用它。處理線程負責關閉它。

+0

你能解釋一下發生了什麼嗎?我用它作爲資源的事實是否會在該try塊之外的地方殺死對象?所以套接字在嘗試調用getInputStream()之前被銷燬? – Chemistpp

+0

1.我已經解釋了會發生什麼。這正是我已經說過的。這是我所說的重複。 4.這就是嘗試與資源是*。 – EJP

+0

感謝您冷靜。你說它關閉它,但爲什麼?它是否因爲它被毀壞而關閉它?還有一點比它關閉它還要多。沒有人讓你回答這個問題,我想你喜歡討論這些問題,或者你不會回答關於SO的問題。並不意味着浪費你的時間。感謝您的回答 – Chemistpp

相關問題