0

私は現在、複数のスレッドがこのプログラムにリクエストを送信できるようにするマルチスレッドソケットベースの Java プログラムに取り組んでいます。これはイベントのアクティベーションで処理する必要がありますが、イベントとその実装を理解するのに苦労しています。以下は、複数のスレッドがプログラムと通信できるようにするコードですが、そこにはスレッドが 1 つしかありません。誰かがこれについてもっと光を当てることができますか? とても有難い。

//this is a a threads class 
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Niti implements Runnable {

    public String line;
    public Socket soc;
    public boolean active=true;

    public Niti(Socket soc)
    {
        this.soc=soc;
        this.line=line;
        this.active=active;
    }


    public synchronized void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
            line=br.readLine();
            while(line!=null && !line.equals("")){

                if(!this.active)
                   break;

                System.out.println(line);
                line=br.readLine();
            }

            BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream());
            bos.write("Poruka iz Programa".getBytes());

        }
        catch (IOException ex) {
            Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {        
           soc.close(); 

        } catch (IOException ex) {
            Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


//and this is the main class
public class Server{


    public static synchronized void main(String[] args) throws IOException, InterruptedException{

        ServerSocket ss = new ServerSocket(1000);

        while(true){
            Socket sokit = ss.accept();
            Niti n = new Niti(sokit);
            while(true){

                Thread t = new Thread(n);
                t.start();

                //Thread.sleep(4000);
                //n.active=false;
                System.out.println("nit broj:" + Thread.currentThread().getId()); 
            }   
        }
    }
}
4

1 に答える 1

0

さて、Niti クラス (私が推測するクライアント ハンドラー クラス) を見ないと、ここに論理エラーがあります。

    while(true){
        Socket sokit = ss.accept();
        Niti n = new Niti(sokit);
        while(true){ // LOGIC ERROR!!!

            Thread t = new Thread(n);
            t.start();

            //Thread.sleep(4000);
            //n.active=false;
            System.out.println("nit broj:" + Thread.currentThread().getId()); 
        }   
    }

上記のコードでは、accept メソッドを初めて通過した後に無限スレッドを作成しています。次のように、2 番目の while(true) を削除する必要があります。

    while(true){
        Socket sokit = ss.accept();
        Niti n = new Niti(sokit);

        Thread t = new Thread(n);
        t.start();

        //Thread.sleep(4000);
        //n.active=false;
        System.out.println("nit broj:" + Thread.currentThread().getId());               
    }
于 2013-04-11T19:33:02.630 に答える