2013-01-01 117 views
1

好的,所以當我第一次連接時一切正常。但是,當我再次連接(不停止服務器程序)時,它會顯示「連接被拒絕:連接」。我認爲這是因爲我只接受一次連接,因此我使用一個swing Timer觸發一個動作事件,每10毫秒觸發一次動作事件,它將clientSocket設置爲serverSocket.accept()(clientSocket = serverSocket.accept( );),所以這裏是代碼:多次連接到插座

package org.code; 

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

public class MainClass { 
    public static void main(String[] args) { 
      new MainClass(); 
    } 


    Socket server = null; 
    PrintWriter out = null; 

    public MainClass() { 
      try { 
        server = new Socket("192.168.0.104", 4444); 
        out = new PrintWriter(server.getOutputStream(), true); 

        out.println("start"); 

        out.close(); 
        server.close(); 
      } catch(Exception ex) {ex.printStackTrace();} 
    } 
} 

和:

package org.code; 

import java.io.*; 
import java.net.*; 
import javax.swing.*; 

public class MainClass { 
    public static void main(String[] args) { 
      new MainClass(); 
    } 

    ServerSocket serverSocket = null; 

    Socket clientSocket = null; 

    BufferedReader in; 

    public MainClass() { 
      JFrame frame = new JFrame("Minecraft Server Manager v0.1 Server"); 
      frame.setSize(500,500); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 

      try { 
        serverSocket = new ServerSocket(4444); 

        clientSocket = serverSocket.accept(); 

        in = new BufferedReader(new   InputStreamReader(clientSocket.getInputStream())); 

        String inputLine; 

        while((inputLine = in.readLine()) != null) { 
          System.out.println(inputLine); 
          if(inputLine.equals("start")) { 
            System.out.println("Good"); 
          } 
          if(inputLine.equals("stop")) { 
            System.out.println("Bad"); 
          } 
        } 

        clientSocket.close(); 
        serverSocket.close(); 
      } catch(Exception ex) {System.err.println("Error: " + ex.getMessage());} 
    } 
} 
+0

這裏的問題究竟是什麼? – jdotjdot

回答

1

您的代碼在每次請求後關閉ServerSocket(並停止)。

這有點更有可能工作。 (我沒有測試,但這個你得到的情況下)

// in your main 
serverSocket = new ServerSocket(4444); 

try { 
    while (true) { 
     clientSocket = serverSocket.accept(); 

     Thread t = new ClientSocketThread(clientSocket); 
     t.start(); 
    } 
} finally { 
    serverSocket.close(); 
} 


class ClientSocketThread extends Thread { 
    final Socket clientSocket; 

    ClientSocketThread(Socket clientSocket) { 
     this.clientSocket = clientSocket; 
    } 

    public void run() { 
     InputStream in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     try 
      String inputLine; 

      while((inputLine = in.readLine()) != null) { 
       System.out.println(inputLine); 
       if(inputLine.equals("start")) { 
        System.out.println("Good"); 
       } 
       if(inputLine.equals("stop")) { 
        System.out.println("Bad"); 
       } 
      } 
     } finally { 
      in.close() 
      clientSocket.close(); 
     } 
    } 
} 
+0

謝謝!這是一個懶惰的錯誤哈哈。我將要經歷製作另一個程序的麻煩,這個程序會檢查服務器是否打開,如果不是,打開它。 – MrLolEthan

1

是,與目前執行的問題是,它只是等待第一個客戶端,然後服務器將停止。檢查Writing the Server Side of a Socket,尤其是最後一項「支持多個客戶端」。通常支持多個客戶端模式如下:

while (true) { 
    accept a connection; 
    create a thread to deal with the client; 
} 
0

你的服務器程序(其中,順便說一句,有exacte相同的類名的客戶端程序,這是不是很明智的),只接受一個連接。

一旦它完成了與第一個客戶端的對話,它就結束了。您認爲它仍在監聽,因爲框架仍然可見,但主要方法已結束。

如果你想接受多個連續的連接,你應該有一個循環。如果你想要多個並行連接,你應該產生線程。

0
clientSocket.close(); 
serverSocket.close(); 

的問題是在這裏。在這一刻關閉服務器套接字沒有意義,因爲你已經完成了一個客戶端。