-1

私はいくつかの問題を抱えています、Javaでクライアント/サーバーシステムを作ろうとしています、次のコードはクライアントに属しています...

public class ClientTCP {

    final static int PORT = 65001;

    Socket _socket;

    private void fireUp(){

        String message = "";

        BufferedReader bfi = null;
        BufferedReader bfr = null;
        PrintWriter writer = null; 

        try{

            InetAddress address = InetAddress.getByName("localhost");

            _socket = new Socket(address,PUERTO);

            bfr = new BufferedReader(
                            new InputStreamReader(System.in));

            bfi = new BufferedReader(
                            new InputStreamReader(_socket.getInputStream()));

            System.out.println("Enter some data");

            String inputstr = bfr.readLine();

            writer = new PrintWriter(_socket.getOutputStream(),true);

            writer.println(inputstr);

            if((message = bfi.readLine()) != null){

                Logger.getLogger(ClientTCP.class.getName()).log(Level.INFO,message);
            }
        }catch(IOException ioex){

            ioex.printStackTrace();
        }finally{

            if(_socket != null){

                try {

                    _socket.close();
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }
    }

...そしてこれはサーバーに属し、スレッドは1つのクライアントごとに作成されます。

public class ServerrTCP {

    static int SEC = 0;

    final static int PORT = 65001;

    Socket _socket;
    ServerSocket _ssocket;

    private void fireUp(){

        try{

            _socket = new Socket();
            _ssocket = new ServerSocket(PORT);

            while(true){

                _socket = _ssocket.accept();

                new ClientThreads(_socket,SEC++);
            }

        }catch(IOException ioex){

            Logger.getLogger(ServerTCP.class.getName()).log(Level.SEVERE,null,ioex);
        }

スレッド作成クラス...

public class ClientThreads extends Thread{

    int _id;
    Socket _socket;


    public ClientThreads(Socket socket, int id){

        super();

        _socket = socket;
        _id = id;

        this.start();
    }

    @Override
    public void run(){

        String strinput;

        BufferedReader bfr = null;
        PrintWriter writer = null;

        try{

            bfr = new BufferedReader(
                    new InputStreamReader(_socket.getInputStream()));

            writer = new PrintWriter(
                    _socket.getOutputStream(),true);

            while((strinput = bfr.readLine()) != null){

                System.out.println("The user "+ _id +" wrote "+ strinput);
            }

            writer.println("Thanks, user " + _id);
        }catch(IOException ioex){

            ioex.printStackTrace();
        }
    }
}

コードの量は申し訳ありませんが、この問題のために私は気が狂います、そして私が間違っているのは太字のものだと思います、それはI /Oをブロックする際に何らかの問題を引き起こしていると思います、でも、その理由と解決方法がわかりません。よろしくお願いします。

4

2 に答える 2

1

クライアントは、サーバーが数行のテキストを送信するのを待っています。サーバーは何も送信しないため、永久に待機します。

サーバーがクライアントに何かを送信して読み取らせるようにすることをお勧めします。

于 2013-01-29T20:07:01.117 に答える
0

問題は、ClientThreadsの次の行にありました。

while((strinput = bfr.readLine()) != null){

          System.out.println("The user "+ _id +" wrote "+ strinput);
}

ループの最後にブレークを追加する必要がありました。そうしないと、常に何らかのコードが要求されます。つまり、I/Oのブロックが終了することはありません。

于 2013-01-29T23:59:43.023 に答える