【问题标题】:Simple Java multi-threaded socket application简单的 Java 多线程套接字应用程序
【发布时间】:2017-12-12 21:06:15
【问题描述】:

我有这个简单的多线程 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; 所以运行会停止运行。但这也破坏了其他联系。

编辑

服务器线程->

private Socket socket;

还有一个函数->

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

像魅力一样工作。

【问题讨论】:

  • 关闭套接字,然后杀死线程。
  • 这个程序的目的是什么?作业?
  • public static 变量是灾难的根源(我相信你刚刚发现了困难的方法)。但正如@cktang 所说,关闭套接字,然后杀死该线程(而不是其他线程)。
  • @randnum-1 这行得通,我什至尝试过,但由于 Joe C 提到的静态变量,这不能正常工作。快速重写它,它现在可以工作了。
  • @AbhijitSarkar 遗憾的是,我们没有在我的大学学习套接字,所以我只是在教育自己添加到投资组合中。所以不,这不是作业。

标签: java multithreading sockets networking


【解决方案1】:

公共静态变量是灾难的根源(我相信你已经 刚刚发现困难的方式)。但正如@cktang所说,关闭套接字, 然后杀死该线程(而不是其他线程)。 -@JoeC

private static Socket socket; 更改为private Socket socket;。 关闭套接字,然后关闭线程。

【讨论】:

    【解决方案2】:

    问题在于

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

    由于它是静态的,它会影响您的所有 ServerThread,但每个 ServerThread(也称为连接的客户端)都应该有自己的套接字和标志来指示它是否处于活动状态。

    从两个属性中删除 static 修饰符并 制作旗帜
    private volatile boolean alive = true;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 2016-07-23
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多