如何在Java中的单独线程中运行客户端套接字?

时间:2014-05-02 20:50:09

标签: java multithreading sockets memory-management

我正在编写一个程序来控制网络交换机上的多个Pc。我不太了解mulithreading以了解内存是如何处理的,但是如何调用infSockeThread.start();并连接到ip1,ip2,ip3 ..?当我发出我的代码时,它显然只是在第二次调用它时覆盖InfoSocket类中的内存。基本上,我想运行InfoSocket类和PC一样多次,每个PC都有自己独特的连接到每台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;

    }

}

1 个答案:

答案 0 :(得分:1)

InfoSocket中的字段不应为static。这就是为什么它在你第二次调用它时会覆盖内存的原因。如果它们不是static,则每个InfoSocket实例都有自己的变量副本。

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

Runnable infRunnable = infSocket;

InfoSocket已经Runnable。你可以简单地写一下:

Thread infSockeThread = new Thread(infSocket);