我试图传递变量" name"从我的main方法到run()方法。
我已经尝试过how can I pass a variable into a new Runnable declaration?
了但是我无法让它发挥作用。我该如何传递该变量? (我已经插入了完整运行程序所需的其他类。)
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();
}
}
}
}
运行完整程序的附加类
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;
}
答案 0 :(得分:0)
您需要以适当的方式指定字段。您需要执行以下操作。
this.name = name;
您有两个名为name
的不同变量。一个是local variable
(方法参数),另一个是instance field
。
您所做的是name = name;
您将本地变量name
引用的String分配给相同的局部变量name
,而您应该做的是分配由局部变量name
到实例字段name
(this.name
)。