线程之间的通信?

时间:2011-08-08 10:22:09

标签: java multithreading networking

有一个包含2个线程的程序。一个线程正在将一些东西写入控制台。

public class Konsole extends Thread {

    static int id = 0;

    Client client;

    public Konsole(Client client) {
        this.client = client;
    }

    public void run() {
        System.out.println("========= Konsole "+ ++id +" started");

    while(true) {


        try {

            String line = client.fromServer.readLine();

            client.commands.add(line);
                System.out.println(line);

                if(line == null) {break;}


        } catch (IOException e) {}

    }
Client类中的

退出公共静态堆栈。 但是堆栈总是空的,Konsole无法访问堆栈。 有人可以给我一个暗示吗?

客户端类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Stack;
import java.util.StringTokenizer;


public class Client extends Thread {

    // Verbindungsvariablen
    final String user = "user";
    final String pass = "pass";
    public String host = "localhost";
    int port = 21;


    // PASV
    int portNew;
    String ipNew = "";

    public static Stack<String> commands = new Stack<String>();

    boolean lastCommand = false;

    // Sockets
    Socket serverSocket;
    Socket pasvSocket;
    PrintWriter writeCommands;
    BufferedReader fromServer;

    PrintWriter writePasvCommands;
    BufferedReader fromPasvServer;

    // Baut die Verbindung auf
    public void connect() throws IOException {

        try {
            serverSocket = new Socket(host, port);
            System.out.println("Baue Verbindung auf ...");
            fromServer = new BufferedReader(new InputStreamReader(
                    serverSocket.getInputStream()));
            writeCommands = new PrintWriter(serverSocket.getOutputStream(),
                    true);
        } catch (UnknownHostException e) {
            System.out.println("Host unbekannt!");
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void USER() throws IOException {
        writeCommands.print("USER " + user + "\n");
        writeCommands.flush();
    }

    public void PASS() {
        writeCommands.print("PASS " + pass +"\n");
        writeCommands.flush();
    }

    public void NOOP() {
        writeCommands.print("NOOP\n");
        writeCommands.flush();
    }

    public void getStatus() {
        Thread konsole = new Thread(new Konsole(this));
        konsole.start();
    }

    // PASV anschalten
    public void PASV() throws IOException, InterruptedException {

        writeCommands.print("PASV\n");
        writeCommands.flush();
        //getPasvCon();


    }
public void getPasvCon() throws IOException, InterruptedException {
        System.out.println("!!!!!!");
        // Commands abholen


        // IP Adresse holen

        String pasv = commands.lastElement();
        String ipAndPort = pasv.substring(pasv.indexOf("(") + 1,
                pasv.indexOf(")"));

        StringTokenizer getIp = new StringTokenizer(ipAndPort);

        // holt die IP
        String ipNew = "";   // IP für den neuen Socket
        for (int i = 0; i < 4; i++) {
            if (i < 3) {
                ipNew += (getIp.nextToken(",") + ".");
            } else {
                ipNew += (getIp.nextToken(","));

            }
        }


        Integer portTemp1 = new Integer( getIp.nextToken(","));
        Integer portTemp2 = new Integer (getIp.nextToken(","));
        portNew = (portTemp1 << 8 )+ portTemp2;


        try {

            pasvSocket = new Socket(ipNew, portNew);

        } catch (UnknownHostException e) {
            System.out.println("Host unbekannt");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            fromPasvServer = new BufferedReader(new InputStreamReader(
                    pasvSocket.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            writePasvCommands = new PrintWriter(pasvSocket.getOutputStream(),
                    true);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   




    }

    public void LIST() throws IOException  {
    writeCommands.print("LIST\n");
    writeCommands.flush();

    }


    public void run() {
        try {
            connect();

    //      getStatus();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            USER();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        PASS();


        try {
            PASV();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Client() throws IOException {

    }



    public static void main(String[] args) throws IOException, InterruptedException {
        Client test = new Client();
        Thread client = new Thread(test);
        client.start();

        Thread.sleep(300);


        Thread konsole = new Thread(new Konsole(test));
        konsole.start();



        Disrupter disrupt = new Disrupter(test);
        disrupt.start();



    }



}

(静态是无意义的,不是吗?)

1 个答案:

答案 0 :(得分:0)

我使用Thread.sleep()解决了我的问题。