LookingWest
LookingWest

Reputation: 69

Passing variable to Java Thread (run() method)

I'm trying to pass the variable "name" from my main method to the run() method.

I've tried this way how can I pass a variable into a new Runnable declaration?

But I couldn't get it to work. How can I pass that variable? (I've inserted the other class needed to run the program in full.)

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.net.InetAddress;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;



public class Server {

    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {

        try {
            final int port = 8181;
            ServerSocket server = new ServerSocket(port);
            System.out.println("Server is up and running, waiting for clients to connect.");

            while (true) {
                Socket sock = server.accept();
                System.out.println("A new user has connected");
                System.out.println("Type \"LIST\" to get a list of commands");
                System.out.println("Enter your Username"); final String name = input.nextLine();
                System.out.println("Now go to the client console to enter your messages");
                new Thread(new Client(sock)).start();
            }

        } catch (Exception e) {
            System.out.println("An error occured.");
            e.printStackTrace();
        }
    }

    static class Client implements Runnable {

        private Socket socket;
        int id;

        public Client(Socket sock)

        {
            id = 1;
            socket = sock;
        }

        @Override
        public void run() {

            long jvmUpTime = ManagementFactory.getRuntimeMXBean().getUptime();
            RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();

            try {

                Scanner in = new Scanner(socket.getInputStream());
                PrintWriter out = new PrintWriter(socket.getOutputStream());

                while (true) {

                    String data = in.nextLine();
                    System.out.println("User : " + data);

                    if (data.startsWith("LEAVENOW")) {
                        System.out.println("Client has left the server");
                        break;
                    }

                    if (data.startsWith("GETIP")) {
                        // System.out.println("Client connected from " +
                        // InetAddress.getLocalHost());
                        System.out.println("Client connected from " + InetAddress.getLocalHost());

                    }
                    if (data.startsWith("SERVERTIME")) {
                        System.out.println(mxBean.getUptime());

                    }
                    /*
                     * if (data.startsWith("SETNAME")) {
                     * 
                     * Scanner input = new Scanner(System.in);
                     * 
                     * System.out.println("Enter your Username"); final String
                     * name = input.nextLine();
                     * System.out.println("Press 1 to confirm your user name");
                     * int namenum = input.nextInt(); if (namenum == 1){
                     * 
                     * System.out.println("name changed"); }
                     * 
                     * 
                     * }
                     */
                    if (data.startsWith("LIST")) {
                        System.out.println("Here is a list of commands that the user can use in the server");
                        System.out.println(
                                "LEAVENOW = exit the server \nGETIP = Gets the IP address of the server \nSERVERTIME = The amount of milliseconds the server has been running \n ");

                    }

                    // send the line back to the client
                    // or whatever custom message we want
                    // out.println(line);
                    // out.flush();

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

The additional class to run the full program

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientInstance {
    final static int port = 8181;
    final static String host = "localhost";

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) throws IOException {

        try {

            Socket sock = new Socket(host, port);

            System.out.println("You connected to " + host);
            System.out.println("Now enter your message ");

            new Thread(new ClientWriter(sock)).start();
            new Thread(new ClientReader(sock)).start();

        } catch (Exception CannotConnect) {
            System.err.println("Could not connect to the server please try again, if error proceeds restart IDE");
        }
    }


    static class ClientWriter implements Runnable {

        public Socket socket;

        public ClientWriter(Socket sock) {
            socket = sock;
        }

        public void run() {
            try {
                Scanner chat = new Scanner(System.in);
                PrintWriter out = new PrintWriter(socket.getOutputStream());

                while (true) {

                    String input = chat.nextLine();
                    out.println(input);
                    out.flush();

                }

            } catch (Exception e) {
                e.printStackTrace();

            }
        }


    }

    static class ClientReader implements Runnable {

        public Socket socket;

        public ClientReader(Socket sock) {
            socket = sock;
        }

        public void run() {
            try {
                /* Scanner scanner = new Scanner(socket.getInputStream());
                  //read data from client
                 while(true) {
                      String data = scanner.nextLine();
                      System.out.println("Received data! : " + data);
                  }
                  */

            } catch (Exception e) {
                e.printStackTrace();

            }
        }


    }
}

So with @Berger advice I changed my code and edited this part. All I did was add the string name as a parameter just like I did with socket sock. However when I call the name variable in my run() method the string just prints null.

new Thread(new Client(sock, name)).start();
            }

        } catch (Exception e) {
            System.out.println("An error occured.");
            e.printStackTrace();
        }
    }

    static class Client implements Runnable {

        private Socket socket;
        int id;
        String name;

        public Client(Socket sock, String name)

        {
            id = 1;
            socket = sock;
            name = name;
        }

Upvotes: 2

Views: 2314

Answers (1)

nits.kk
nits.kk

Reputation: 5336

You need to assign your fields in a proper way. You need to do as below.

this.name = name;

You have two different variables named as name. One is local variable (method parameter) and another is instance field.

What you have done is by name = name; you are assiging String referenced by your local variable name to same local variable name, instead what you should be doing is to assign String referenced by local variable name to instance field name ( which is this.name ).

Upvotes: 1

Related Questions