简单Java多线程套接字应用程序

简单Java多线程套接字应用程序,java,multithreading,sockets,networking,Java,Multithreading,Sockets,Networking,我有一个简单的多线程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("localhos

我有一个简单的多线程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();
    }

}
}
现在,当我有多个连接时。它为每个连接创建不同的线程。 当用户想要断开与此服务器的连接时,我应该怎么做

我应该把线弄断吗,插座

我试着对线程说
alive=false因此运行将停止运行。但这也破坏了其他联系

编辑

服务器线程->

private Socket socket;
和一个函数->

void closeConnection() throws IOException{
    this.socket.close();
}
工作起来很有魅力

公共静态变量会导致灾难(我相信您已经知道了) 刚发现困难的方法)。但正如@cktang所说,关闭插座, 然后杀死该线程(而不是其他线程)-@约克

更改了
专用静态套接字
专用插座
关闭套接字,然后执行线程。

问题在于

public static boolean alive = true;
private static Socket socket;
由于它是静态的,它会影响所有
ServerThread
,但每个
ServerThread
(也称为连接的客户端)都应该有自己的套接字和标志,指示它是否处于活动状态

从属性和属性中删除
静态
修饰符 使标志
private volatile boolean alive=true


首先关闭套接字a,然后停止线程(并将其从列表中删除)。

关闭套接字,然后终止线程。此程序的目的是什么?家庭作业?
publicstatic
变量会导致灾难(我相信你刚刚发现了困难的方向)。但正如@cktang所说,关闭套接字,然后杀死该线程(而不是其他线程)。@randnum-1这是可行的,我甚至尝试过,但由于Joe C提到的静态变量,这无法正常工作。很快重写,现在就可以了。@AbhijitSarkar遗憾的是,我们没有在我的大学里学习sockets,所以我只是在教育自己加入投资组合。所以不,这不是家庭作业。
public static boolean alive = true;
private static Socket socket;