客户端java中的服务器地址

客户端java中的服务器地址,java,webserver,ip-address,hostname,Java,Webserver,Ip Address,Hostname,我正在尝试获取客户端访问我的服务器的地址 如果客户端使用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

我正在尝试获取客户端访问我的服务器的地址

  • 如果客户端使用
    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()
返回它
localhost
,而不是
127.0.0.1

我需要服务器获取作为
COOKIES
发送数据的客户端的地址,不丢失任何重定向发生的机会(
302已找到
301已永久移动

我到处搜索,特别是在操作系统中,但我不知道使用什么搜索词(如果有人已经问过这个问题),所以如果这是重复的,请原谅

我的代码:

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();
            }
        }
    }
}
解决方案:

假设我使用浏览器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(新的InputStreamReader(remote.getInputStream())


然后,只需使用
.slit(“:”
新的StringTokenizer(currentLine)
提取主机的地址:
,我认为您需要使用HTTP提供的完整GET请求路径。较低级别的网络不会区分客户机是否指定了主机名或地址(因为客户机本身会将主机名映射到地址,如果客户机配置了服务器没有的主机/地址映射,会发生什么情况?)

我认为您需要使用HTTP提供的完整GET请求路径。较低级别的网络不会区分客户机是否指定了主机名或地址(因为客户机本身会将主机名映射到地址,如果客户机配置了服务器没有的主机/地址映射,会发生什么情况?)

您是否尝试将
hosts
文件更改为
127.0.0.1->localhost
?感谢您的回复,但这不是编辑
hosts
和yes编程的问题。如果您有任何想法,请回复我,谢谢。您是否尝试将
主机
文件更改为
127.0.0.1->localhost
?感谢您的回复,但这不是编辑
主机
和yes编程的问题。如果您有任何想法,请回复我,非常感谢。在
apache
服务器中,您可以按照客户的要求准确地处理Identificiar。我需要以同样的方式工作(我需要服务器获取作为cookie发送数据的客户端的地址,而不是丢失任何重定向发生的机会(
302找到了
301永久移动了
))。感谢您的关注。@guilhermanascimento-Apache拥有这些信息,因为它包含在对服务器的GET请求中。这是Brian Agnew建议您使用的+1顺便问一下,您是指客户发送的
标题吗?我会尝试的。好的,它成功了,我编辑了我的问题,我在那里解释了如何使用“头”来获取客户访问的地址。谢天谢地<@Bryan_Agnew的code>+1和@Perception的
+1引导我找到了解决方案。在
apache
中,服务器可以准确地满足客户的需求。我需要以同样的方式工作(我需要服务器获取作为cookie发送数据的客户端的地址,而不是丢失任何重定向发生的机会(
302找到了
301永久移动了
))。感谢您的关注。@guilhermanascimento-Apache拥有这些信息,因为它包含在对服务器的GET请求中。这是Brian Agnew建议您使用的+1顺便问一下,您是指客户发送的
标题吗?我会尝试的。好的,它成功了,我编辑了我的问题,我在那里解释了如何使用“头”来获取客户访问的地址。谢天谢地<@Bryan_Agnew的代码>+1
和@Perception的代码>+1,这让我找到了解决方案。
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