簡體   English   中英

簡單的Java多線程套接字應用程序

[英]Simple Java multi-threaded socket application

我有這個簡單的多線程Java套接字應用程序。 使用類Client.java

public class Client {

private static Socket socket;
private static boolean waitForServer = false;
public static void main(String[] args) throws IOException {
    while(true){
        socket = new Socket("localhost", ServerPortInfo.getPort());
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader bufferedReader = new java.io.BufferedReader(new InputStreamReader(System.in));

        while(true){
            PrintWriter.println(name + " Hello");
                waitForServer = true;

            if (waitForServer){
                BufferedReader inputBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String inputString = null;
                while((inputString = inputBufferedReader.readLine()) != null){
                    System.out.println(inputString);
                    break;
                }

            }

        }

    }
  }
}

和Server.java

public class Server {

public static ArrayList<ServerThread> connections = new ArrayList<ServerThread>();

public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
    // Init server functionality
    new Server().runServer();


}

// Implementing server functionality
public void runServer() throws IOException{

    ServerSocket serverSocket = new ServerSocket(ServerPortInfo.getPort());
    System.out.println("Server is running... Waiting for connections");
    while (true){
        Socket socket = serverSocket.accept();
        // After connection handle clients in threads
        ServerThread newThread = new ServerThread(socket);
        connections.add(newThread);
        newThread.start();
    }

}
}

然后是一個處理該連接的線程...

public class ServerThread extends Thread {

private static Socket socket;
public static boolean alive = true;

ServerThread(Socket socket){
    this.socket = socket;
}

public void run(){
    if (alive) {
        //DO STUFF NOW
}       

}

現在,當我有多個連接時。 它為每個連接創建一個不同的線程。 當用戶想要從該服務器斷開連接時該怎么辦?

我應該殺死線程,套接字嗎?

我試着只是對線程說alive = false; 因此運行將停止運行。 但這也會破壞其他連接。

編輯

ServerThread->

private Socket socket;

和功能->

void closeConnection() throws IOException{
    this.socket.close();
}

奇跡般有效。

公共靜態變量是災難的根源(因為我敢肯定,您已經找到了很難的方法)。 但是正如@cktang所說,關閉套接字,然后殺死該線程(而不是其他線程)。 -@ JoeC

更改了private static Socket socket; private Socket socket; 關閉套接字,然后關閉線程。

問題出在

public static boolean alive = true;
private static Socket socket;

由於它是靜態的,因此會影響您所有的ServerThread ,但是每個ServerThread (也稱為已連接的客戶端)應具有自己的套接字和標志,以指示其是否有效。

從兩個屬性中刪除static修飾符並進行標記
private volatile boolean alive = true;

首先,關閉套接字a,然后停止線程(並將其從列表中刪除)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM