2016-12-12 5 views
2

Ich versuche die Variable "name" von meiner Hauptmethode an die run() Methode zu übergeben.Übergabe der Variablen an die Java Thread (run() Methode)

Ich habe auf diese Weise versucht, how can I pass a variable into a new Runnable declaration?

Aber ich konnte es nicht zur Arbeit kommen. Wie kann ich diese Variable übergeben? (Ich habe die andere Klasse eingeführt, um das Programm in vollem Umfang auszuführen.)

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

    } 

} 

Die zusätzliche Klasse das volle Programm

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 mit @Berger Beratung laufen änderte ich meinen Code und bearbeiten dieser Teil. Alles, was ich tat, war, den String-Namen als Parameter hinzuzufügen, genau wie ich es mit Socket Socke getan habe. Wenn ich jedoch die name-Variable in meiner run() -Methode aufruft, gibt die Zeichenfolge nur null aus.

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; 
     } 
+1

Fügen Sie es einfach als Parameter in Ihrem 'Client' Runnable:' Client (Socket Sock, String name) ', speichern Sie es wie Sie bereits mit dem Sockel, und rufen Sie' neue Client (Socke, Name) ' – Berger

+0

I habe versucht, das zu tun, aber anstelle des Namens, den ich eingegeben habe, druckt es null. Ich zeige eine Bearbeitung meines ursprünglichen Posts, was ich mit meinem Code gemacht habe. – LookingWest

+0

Sind Sie sicher, dass der übergebene Wert nicht null war? Wurde der Name schon gelesen? –

Antwort

0

Sie müssen Ihre Felder ordnungsgemäß zuweisen. Sie müssen wie folgt vorgehen.

this.name = name; 

Sie haben zwei als name benannt verschiedene Variablen. Einer ist local variable (Methodenparameter) und ein anderer ist instance field.

Was Sie getan haben, von name = name; ist Sie String von Ihrem lokalen Variablen name auf gleiche lokale Variable verwiesen wird assiging name, statt, was Sie sollten tun, ist String durch lokale Variable name zu Instanzfeld name (bezogen auf zuweisen, die this.name ist).

+0

Vielen Dank, das hat mein Problem behoben! – LookingWest

+0

@LookingWest toll, jetzt, wenn Ihr Problem behoben ist dann können Sie meine Antwort als akzeptiert markieren :) und wahrscheinlich upvote –

+1

Ich habe nicht genug Ruf, um Sie zu verbessern, aber ich habe Ihre Antwort als akzeptiert markiert :) – LookingWest

Verwandte Themen