有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程如何在Java中的不同线程中运行客户端socket?

我正在编写一个程序,通过网络交换机控制多台Pc。我对mulithreading了解不够,无法理解内存是如何处理的,但是我如何调用infSockeThread.start();并连接到ip1、ip2、ip3。。?当我按原样发布代码时,显然在我第二次调用它时,它会覆盖InfoSocket类中的内存。基本上,我希望运行InfoSocket类的次数与运行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();

        }

然后我有了我的socket类:

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) 个答案

  1. # 1 楼答案

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

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

    Runnable infRunnable = infSocket;
    

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

    Thread infSockeThread = new Thread(infSocket);