我正在编写一个程序来控制网络交换机上的多个PC。我对mulithreading的了解不足以了解如何处理内存,但是如何调用infSockeThread.start();并连接到ip1,ip2,ip3 ..?当我按原样发布代码时,它显然只是在第二次调用它时覆盖了InfoSocket类中的内存。基本上,我想像运行PC一样多次运行InfoSocket类,每台PC都有各自的唯一连接。

例如,我在主类中称呼它为:

        String[] compTestArray = {"172.16.98.6", "172.16.98.3"};

        for(int i = 0; i < compTestArray.length; i++){

            InfoSocket infSocket = new InfoSocket(compTestArray[i]);
            Runnable infRunnable = infSocket;
            Thread infSockeThread = new Thread(infRunnable);

            infSockeThread.start();

        }


然后我有我的套接字类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class InfoSocket implements Runnable {

    protected static Socket infoSocket;
    protected static PrintWriter out;
    protected static BufferedReader in;
    protected static String ip;

    public InfoSocket(String ipaddress){

        ip = ipaddress;

    }

    @Override
    public void run() {

        System.out.println("InfoSocket Thread Started");
        // TODO Auto-generated method stub
        String hostName = ip, fromServer = null;
        int portNumber = 6000;
        boolean socketConnected = false;

        while (!socketConnected) {

            try {

                Main.textArea.append("Attempting to connect to " + hostName
                        + "\n");
                Thread.sleep(5000);
                infoSocket = new Socket(hostName, portNumber);
                out = new PrintWriter(infoSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(
                        infoSocket.getInputStream()));

                System.out.println("Connected sent to server");

                // BREAK POINT
                fromServer = in.readLine();

                while (!fromServer.equals("connect")) {

                    Thread.sleep(1000);
                    System.out.print("Waiting for connection response from machine");

                }

                sendResponse(fromServer);

                // Break while loop because connection was successful
                socketConnected = true;

            } catch (Exception e) {
                e.printStackTrace();
                Main.textArea.append("Connection to " + hostName
                        + " failed, trying again\n");
            }
        }

        while (socketConnected) {

            System.out.println("Thread to send response sleeping");

            // Sleep for a second
            try {
                Thread.sleep(300);
                // Get info from server if available
                fromServer = in.readLine();
                System.out.println("From Server: " + fromServer + "\n");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // Send response back to server based off
            // of its input, only if the input is not equal to 'null'
            try {
                if (fromServer != null) {

                    System.out.println("Hit sendResponse");
                    sendResponse(fromServer);

                }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    public static String sendResponse(String action)
            throws InterruptedException, IOException {

        String str = " "; // Value to hold string to be returned

        System.out.println("\nInside sendResponse");
        System.out.println("Inside sendResponse & action is " + action + "\n");

        switch (action) {

        case "connect":
            System.out.println("Inside connect");
            out.println("success");
            break;
        case "ready":
            System.out.println("Inside ready");
            out.println("success");
            break;
        case "sync":
            System.out.println("Inside sync");
            Thread.sleep(10000);
            out.println("success");
            break;
        default:
            out.println(" ");

        }

        System.out.println("end of sendResponse");

        return str;

    }

}

最佳答案

InfoSocket中的字段不应为static。这就是为什么第二次调用它会覆盖内存。如果不是static,则每个InfoSocket实例将拥有自己的那些变量副本。

顺便说一句,没有必要写:

Runnable infRunnable = infSocket;


InfoSocket已经是Runnable。您可以简单地写:

Thread infSockeThread = new Thread(infSocket);

10-01 20:45