クライアントがサーバーにアクセスしたアドレスを取得しようとしています。
クライアントがサーバーにアクセスする場合、
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 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)