0

クライアントが接続するたびに新しいスレッドを生成する単純な Web サーバーを作成しています。次に、BufferedOutputStream を使用して応答を送信する必要があります (HTTP プロトコルでは行末に /r/n が必要なため)。これが私のコードです:

class HttpServer{
    public static void main(String args[]){
        ServerSocket ss = null;
        int port = 40000;

        try{
            if(args.length > 0){
                port = Integer.parseInt(args[0]);
            }

            ss = new ServerSocket(port);

            while(true){
                Socket client = ss.accept();
                User user = new User(client);
                user.start();
            }
        }
        catch(Exception e){
                System.err.println(e.getMessage());
        }
    }
}

そして私のユーザークラス:

class User extends Thread{

        Socket client;

        public User(Socket s){
            client = s;
        }

        public void run(){
            try{
                BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());

                println(bos, "Hello World");
                bos.close();

                client.close();
            }
            catch(Exception e){
                    System.err.println(e.getMessage());
            }
        }

        private void println(BufferedOutputStream bos, String s) throws IOException { 
            String news = s + "\r\n"; 
            byte[] array = news.getBytes(); 
            for(int i=0; i<array.length; i++){
                bos.write(array[i]);
            }
            return;
        }
    }

この問題は、BufferedOutputStream を作成しようとすると発生します。「ソケットが閉じられています」というエラーが表示され、その理由がわかりません。

どんな助けでも大歓迎です。

ありがとう!

これは動作しないコードです:

class User extends Thread{

    Socket client;

    public User(Socket s){
        client = s;
    }

    public void run(){
        try{
            System.out.println("Address: " + client.getInetAddress().toString());

            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));

            String line;
            Boolean first = true;
            while(!((line = reader.readLine()).equals(""))){
                if(first)
                    System.out.println(line.split(" ")[1]);
                first = false;
            }
            reader.close();

            BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());
            println(bos, "Hello World");
            bos.close();



            // Close socket
            client.close();
        }
        catch(Exception e){
                System.err.println(e.getMessage());
        }
    }

    private void println(BufferedOutputStream bos, String s) throws IOException { 
        String news = s + "\r\n"; 
        byte[] array = news.getBytes(); 
        for(int i=0; i<array.length; i++){
            bos.write(array[i]);
        }
        return;
    }
}
4

3 に答える 3

3

この例外は、Socket を閉じたことを意味します。

ソケットの入力ストリームまたは出力ストリームを閉じると、他の 2 つが閉じられ、FilterInput/OutputStream/Reader/Writer を閉じると、フィルタリングしているストリーム/リーダー/ライターが閉じられます。

于 2013-08-04T01:09:52.763 に答える
-1

私が知る限り、あなたのコードに問題はありません。オペレーティング システムまたはブラウザが何らかの方法でサーバーへのアクセスを制限している可能性が高いようです。

于 2013-08-03T11:54:41.290 に答える
-1
Socket client = ss.accept();
User user = new User(client);
user.start();

コールはaccept接続を待ってブロックします。ユーザー スレッドが作成されることはありません。新しいスレッドを作成し、メッセージをサーバーに書き込む新しい User クラスを作成する必要があります。

    public class User extends Thread{

            Socket client;
            int port;
            public User(int p) throws UnknownHostException, IOException{
                port = p;
                client = new Socket(InetAddress.getLocalHost(), 40000);
            }

            public void run(){
                try{
                    BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());

                    println(bos, "Hello World");
                    bos.close();

                    client.close();
                }
                catch(Exception e){
                        System.err.println(e.getMessage());
                }
            }

            private void println(BufferedOutputStream bos, String s) throws IOException { 
                String news = s + "\r\n"; 
                byte[] array = news.getBytes(); 
                for(int i=0; i<array.length; i++){
                    bos.write(array[i]);
                }

                return;
            }

            public static void main(String[] args) throws UnknownHostException, IOException {
                User user = new User(4000);
                user.start();
            }
        }

サーバーは着信接続のみをリッスンする必要があります(おそらくそれを出力します)

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


class HttpServer{
    public static void main(String args[]){
        ServerSocket ss = null;
        int port = 40000;

        try{
            if(args.length > 0){
                port = Integer.parseInt(args[0]);
            }

            ss = new ServerSocket(port);

            while(true){
                Socket client = ss.accept();
                Scanner scanner = new Scanner(client.getInputStream());
                while (scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            }
        }
        catch(Exception e){
                System.err.println(e.getMessage());
        }
    }
}

両方を異なる Java プロセスとして実行すると、サーバー側で hello world が表示されるはずです。ポートを変更する場合、クライアント側でもこれを変更する必要がある場合があります。

于 2013-08-03T11:57:40.703 に答える