0

クライアントがサーバーにアクセスしたアドレスを取得しようとしています。

  • クライアントがサーバーにアクセスする場合、http://localhost:8890サーバーは正確に読み取る必要がありますhttp://localhost:8890

  • クライアントがサーバーにアクセスする場合、http://127.0.0.1:8890サーバーは正確に読み取る必要がありますhttp://127.0.0.1:8890

  • クライアントがサーバーにアクセスする場合、http://mywebsite.com:8890 サーバーは正確に読み取る必要がありますhttp://mywebsite.com:8890

関数で部分的に取得しました:[SOCKET].getInetAddress().getHostName()

ただし、クライアント アクセスhttp://127.0.0.1:8890関数はの代わりに[SOCKET].getInetAddress().getHostName()それを返します。localhost127.0.0.1

COOKIESリダイレクトが発生する可能性が失われないため、データを送信したクライアントとしてサーバーがアドレスを取得する必要があります(302 Foundまたは301 Moved Permanently)。

特にOSで、どこでも検索しましたが、どの検索用語を使用すればよいかわかりません(誰かがすでにこの質問をしている場合)。これが重複していたらすみません。

私のコード:

package com.[PACKAGE];

/*web server*/
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Locale;

/*Err*/
//import java.io.IOException;

public class miniWebServer {
    private int port;
    private ServerSocket mySocket;
    private Socket remote;
    private Thread trd;

    public miniWebServer(int _port) {
        port = _port;
        initServer();
    }

    private void initServer(){
        trd = new Thread(new Runnable(){
            @Override
            public void run(){
                try {
                    //Criar socket
                    mySocket = new ServerSocket(port);
                    System.out.println("Conected!");
                    OK();
                } catch (Exception e) {
                    String st = e.toString().toLowerCase(Locale.US);
                    if(st.indexOf("address already in use")!=-1){
                        System.out.println("Server ");
                        OK();
                    } else {
                        System.err.println("Erro ao tentar conectar com a port " + port + ": "+ e);
                    }
                    return;
                }
                listen();
            }
        });
        trd.start();
    }

    public void OK(){}//Override

    private void listen(){
        String addressClient = "";
        String portClient = "";
        PrintWriter outServer;

        for (;;) {
            try {
                //Esperando uma conexão (um cliente)
                remote = mySocket.accept();
                System.out.println("remote: "+remote.toString());
                System.out.println("getLocalAddress: "+remote.getLocalAddress().toString());
                System.out.println("getHostName: "+remote.getInetAddress().getHostName().toString());
                System.out.println("getLocalSocketAddress: "+remote.getLocalSocketAddress().toString());
                addressClient = remote.getInetAddress().getHostName().toString();
                portClient = Integer.toString(remote.getLocalPort());
                System.out.println("http://"+addressClient+":"+portClient);

                outServer = new PrintWriter(remote.getOutputStream());

                outServer.println("HTTP/1.0 200 OK");
                outServer.println("Content-type: text/html");
                outServer.println("");
                outServer.println("<html>");
                outServer.println("<body>");
                outServer.println("<p>You address: http://"+addressClient+":"+portClient+"</p>");
                outServer.println("</body>");

                outServer.print("</html>");//last line

                outServer.flush();

                remote.close();
            } catch (Exception e) {
                //System.out.println("loop::Error: " + e);
            }

            try {
                //Thread.currentThread();
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

使い方:

new miniWebServer(8890){
    @Override
    public void OK(){
        System.out.println("OK!");
    }
};

解決:

ブラウザー GoogleChrome を使用すると仮定すると、私の Java サーバーはこれを返します。

GET /folder/page.html HTTP/1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US;q=0.6,en;q=0.4
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8890
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

ヘッダーとリクエストを取得するには: inServer = new BufferedReader(new InputStreamReader(remote.getInputStream()));

Host:次に、.slit(":")またはのアドレスを抽出するだけですnew StringTokenizer(currentLine)

4

1 に答える 1

4

HTTP によって提供される完全な GET 要求パスを使用する必要があると思います。下位レベルのネットワークは、クライアントがホスト名またはアドレスを指定したかどうかを区別しません (クライアント自体がホスト名をアドレスにマップするため、サーバーがホスト/アドレス マッピングを使用してクライアントが構成されている場合はどうなるか)ない?)

于 2013-02-10T18:04:37.923 に答える