0

Java で単純な HTTP Web サーバーを作成しようとしています。私はこれを赤ちゃんのステップで取っているだけなので、非常に単純化されています. クライアントから単純な入力を読み取り、両方が接続されているときにサーバーから何かを出力できるようにしようとしています。

ウェブサイトのチュートリアルを検索した後、これは私がこれまでに行ったことです:

public class Server
{
    public static void main(String[] args) throws Exception
    {
        boolean listening = true;
        ServerSocket server = null;
        int port = 2222;
        try
        {
            System.out.println("Server binding to port " + port);
            server = new ServerSocket(port);
        }
        catch(Exception e)
        {
            System.out.println("Error: " + e);
            System.exit(1);
        }

        System.out.println("Server successfully binded to port " + port);

        while(listening)
        {
            System.out.println("Attempting to connect to client");
            Socket client = server.accept();
            System.out.println("Successfully connected to client");
            new ServerThread(client).start() ;
        }

        server.close();
    }
}

public class ServerThread extends Thread
{
    private Socket socket = null ;
    public ServerThread(Socket s)
    {
        this.socket = s ;
    }

    public void run()
    {       
        InputStream in = socket.getInputStream() ;
        OutputStream out = socket.getOutputStream() ;
        byte [] message, reply;
        while((in.read(message))
        {
            out.write(reply) ;
        }
        in.close() ;
        out.close() ;
        socket.close() ;    
    }
}

クライアントへの接続を試みた後、バインドしてからハングします。これは、ServerThread の while ループで何をしているのか、メッセージ変数と応答変数で何をしているのかよくわからないためです >_< Java をやるのは久しぶりなので、気楽にやってください!

4

4 に答える 4

1

私はこの種のサーバーを「好奇心」としてのみ使用しており、車輪の再発明、セキュリティ上の理由などのため、新しいことを学ぶためだけに使用しています...サーバーとJSONを通信する必要があったため、一度だけ使用する必要がありましたコードとサーバーをインストールできませんでした。このコードには、リクエストごとに新しいスレッドを作成するなど、より多くの作業が必要です。より良い RCF HTTP 実装ですが、通常のブラウザーで動作します。

これが役立つことを願っています。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MiniPbxManServer extends Thread {
    private final int PORT = 2222;    
    public static void main(String[] args) {
        MiniPbxManServer gtp = new MiniPbxManServer();
        gtp.start();
    }    
    public void run() {
        try {
            ServerSocket server = new ServerSocket(PORT);
            System.out.println("MiniServer active "+PORT);
            boolean shudown = true;
            while (shudown) {               
                Socket socket = server.accept();                
                InputStream is = socket.getInputStream();
                PrintWriter out = new PrintWriter(socket.getOutputStream());            
                BufferedReader in = new BufferedReader(new InputStreamReader(is));              
                String line;
                line = in.readLine();
                String auxLine = line;
                line = "";
                // looks for post data
                int postDataI = -1;
                while ((line = in.readLine()) != null && (line.length() != 0)) {
                    System.out.println(line);
                    if (line.indexOf("Content-Length:") > -1) {
                        postDataI = new Integer(line
                                .substring(
                                        line.indexOf("Content-Length:") + 16,
                                        line.length())).intValue();
                    }
                }
                String postData = "";
                for (int i = 0; i < postDataI; i++) {
                    int intParser = in.read();
                    postData += (char) intParser;
                }                               
                out.println("HTTP/1.0 200 OK");
                out.println("Content-Type: text/html; charset=utf-8");
                out.println("Server: MINISERVER");
                // this blank line signals the end of the headers
                out.println("");
                // Send the HTML page               
                out.println("<H1>Welcome to the Mini PbxMan server</H1>");
                out.println("<H2>GET->"+auxLine+ "</H2>");        
                out.println("<H2>Post->"+postData+ "</H2>");
                out.println("<form name=\"input\" action=\"imback\" method=\"post\">");
                out.println("Username: <input type=\"text\" name=\"user\"><input type=\"submit\" value=\"Submit\"></form>");                 
                //if your get parameter contains shutdown it will shutdown
                if(auxLine.indexOf("?shutdown")>-1){
                    shudown = false;
                }
                out.close();
                socket.close();
            }
            server.close();            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
}

URL: localhost:2222/whatever

于 2012-10-07T19:32:02.967 に答える
0

サーバーの出力ストリームから常にデータをフラッシュする必要があります。クライアントの応答は、これに依存する場合があります。

out.flush();

ストリームの終わりを確認するには、次を使用できます。

int result = 0;
while ((result = in.read(message)) != -1) {
...

また、返信メッセージが初期化されていないようです。最初にクライアント データを再送信することをお勧めします。

reply = message;
于 2012-10-07T15:51:05.373 に答える
0

jdk には、組み込みの http サーバーを構築するための単純な http サーバーが含まれています。このリンクを見てください。

于 2012-10-07T16:18:11.847 に答える
0

あなたは高いレベルで正しい道を進んでいると思います。あなたが持っているものと実稼働システムの違いは、入力を待っている間にシステムを停止しないように、ソケットでの入力のポーリングが別のスレッドで行われることです。

実際、Web サーバーの構成パラメーターの 1 つは、稼働しているクライアント (スレッド) の数です。

于 2012-10-07T15:45:16.173 に答える