将变量传递给Java线程(run()方法)

将变量传递给Java线程(run()方法),java,sockets,Java,Sockets,我试图将变量“name”从main方法传递到run()方法 我试过这种方法 但我无法让它工作。如何传递该变量?(我插入了完整运行程序所需的其他类。) 运行完整程序的附加类 import java.io.IOException; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class ClientInstance { final static int port =

我试图将变量“name”从main方法传递到run()方法

我试过这种方法

但我无法让它工作。如何传递该变量?(我插入了完整运行程序所需的其他类。)

运行完整程序的附加类

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();

            }
        }


    }
}
因此,在@Berger的建议下,我修改了代码并编辑了这一部分。我所做的只是添加字符串名作为参数,就像我对socket sock所做的那样。但是,当我在run()方法中调用name变量时,字符串只打印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;
        }

您需要以适当的方式分配字段。你需要做如下的事情

this.name = name;
您有两个不同的变量名为
name
。一个是
局部变量
(方法参数),另一个是
实例字段


你所做的是通过
name=name
您正在将本地变量
name
引用的字符串分配给同一个本地变量
name
,相反,您应该做的是将本地变量
name
引用的字符串分配给实例字段
name
(即
this.name
).

只需将其作为参数添加到您的
客户端中即可运行:
客户端(Socket sock,String name)
,像使用套接字一样存储它,然后调用
新客户端(sock,name)
我尝试过这样做,但输入的名称不是空的。我将在我的原始帖子上显示我对代码所做的编辑。你确定传递的值不是null吗?名称是否已被读取?我要求用户在客户机类连接到服务器类后立即输入名称的值。直到用户输入字符串名的值,程序才会继续。非常感谢,这解决了我的问题@看起来很好,如果你的问题解决了,那么你可以把我的答案标记为接受:)并投票表决
this.name = name;