導航:首頁 > IDC知識 > javaip代理伺服器

javaip代理伺服器

發布時間:2020-11-16 14:50:54

1、在Java中如何得到本地IP和伺服器的機器名???

import java.net.*;public class catchserverip{InetAddress ServerIPaddress=null;//取得Server的IP地址public InetAddress getServerIP() {try { ServerIPaddress=InetAddress.getLocalHost();}catch (UnknownHostException e) {}return (ServerIPaddress);}}就可以了在回jsp中寫答<jsp:useBean id=catchipbean scope=page class=catchip /String servername=catchipbean.getServerIP().getHostName();---------------------------------------------------------------

2、我用java的socket機制編了一個代理伺服器,客戶端已經與代理建立了連接,如何讓代理與web伺服器連接?

代理伺服器解析客戶端傳入的數據,得到伺服器ip和埠,然後創建與伺服器的連接。解析代碼如下:(這里只處理了socket v5的情況,Config的常量對應java.net.SocksConsts)

try {
// socket v5
// 4byte(5 2 0 2) @see java.net.SocksSocketImpl
int len = dis.read(buffer);
// reply client
dos.write(new byte[]{Config.PROTO_VERS, Config.NO_AUTH});
dos.flush();

// read
// PROTO_VERS(1byte)
// CONNECT(1byte)
// 0(1byte)
// DOMAIN_NAME/IPV4/IPV6(1byte)   DOMAIN_NAME(not consider now)
// addr(IPV4:4byte/IPV6:16byte)
// port>>8&0xff(1byte)
// port&0xff(1byte)
len = dis.read(buffer);
byte addrType = buffer[3];
byte[] applyData = null;

String serverIp = null;
int serverPort = 0;
if (addrType == Config.IPV4) {
serverIp = Util.bytes2ipv4(buffer, 4, 4);
serverPort = buffer[8] << 8 | buffer[9];
// set reply data
applyData = new byte[10];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV4;
for (int i = 4; i < 10; i++) {
// fill ip, port
applyData[i] = buffer[i];
}
} else if (addrType == Config.IPV6) {
serverIp = Util.bytes2ipv6(buffer, 4, 16);
serverPort = buffer[20] << 8 | buffer[21];
// set reply data
applyData = new byte[6];
applyData[1] = Config.REQUEST_OK;
applyData[3] = Config.IPV6;
applyData[4] = buffer[20];
applyData[5] = buffer[21];
}
// reply
dos.write(applyData);
dos.flush();

// connect the server
// serverIp是伺服器ip,serverPort是伺服器埠,用這兩個
// 創建與伺服器的socket連接
Socket socket = new Socket(serverIp, serverPort);
// 之後處理客戶端與伺服器的數據交互就用這個socket轉發就行了

// finally success!!!
} catch (Exception e) {
    e.printStackTrace();
}

3、Java編程 怎樣獲得自己在外網的真實ip

方法:
public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }

可是當訪問http://www.5a520.cn /index.jsp/ 時,返回的地址始終是unknown,也並不是如上所示的127.0.0.1 或 192.168.1.110了,而我訪問http://192.168.1.110:2046/index.jsp 時,則能返回客戶端的真實IP地址,寫了個方法去驗證。
原因出在了Squid上。squid.conf 的配製文件 forwarded_for 項默認是為on,如果 forwarded_for 設成了 off  
則:X-Forwarded-For: unknown

4、怎麼在tomcat啟動時自動執行一個java類 獲得本項目伺服器的IP和埠

@PostConstruct
  public void init() {
    try {
      MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
      Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
              Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
      serverIp = InetAddress.getLocalHost().getHostAddress();
      serverPort = objectNames.iterator().next().getKeyProperty("port");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  這段代碼可以獲取到,但是存在一個問題就是在Linux環境下啟動項目的時候,
  objectNames.iterator().next().getKeyProperty("port");這句會拋出異常:
  java.util.NoSuchElementException。如果僅僅是在Windows下的話,上面的代碼完全OK

5、java服務端如何獲得客戶端的ip

網路通信可分為兩種模式:TCP有連接的通信
UDP無連接的通信
依照上述的問題我可以理解為你是要進行有連接的通信。是要經過三次握手才能實現可靠的連接
第一次:建立連接時三次握手,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN(Synchronize Sequence Numbers)同步序列號。

伺服器端即可使用:
Socket s=serverSocket.accept();
String clientIP=s.getInetAddress().toString();

這就實現了java伺服器端獲取到連接此伺服器的客戶端的IP了,你若想實現獲取所有連接此伺服器的客戶端的IP,你可以把每次accept()返回的socket放進全局的Vector裡面,然後在遍歷這個vector方法就同上代碼咯……

6、nginx做反向代理負載均衡 Java怎麼獲取後端伺服器獲取用戶IP

首先,在前端nginx上需要做如下配置:
location /
proxy_set_hearder host $host;
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
};
nginx會在把請求轉向後台real-server前把http報頭中的ip地址進行替換;這樣操作完成後,real-server也需要做一些操作;

public class ClientIPUtils {
/**
* 在很多應用下都可能有需要將用戶的真實IP記錄下來,這時就要獲得用戶的真實IP地址,在JSP里,獲取客戶端的IP地
* 址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等
* 反向代理軟體就不能獲取到客戶端的真實IP地址了。
* 但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的伺服器地址。
* @param request
* @return
*/
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
  //String ip = request.getHeader("X-real-ip");
logger.debug("x-forwarded-for = {}", ip);
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.debug("Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.debug("WL-Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.debug("RemoteAddr-IP = {}", ip);
}
if(StringUtils.isNotBlank(ip)) {
ip = ip.split(",")[0];
}
return ip;

}
}

7、java的servlet 不通過request能獲取到伺服器IP與提供的埠號嗎。

所以javascript可以通過ajax技術來獲得後端語言得到的IP,並返回到前端。
1:通過java的servlet獲取IP:
public String getRemoteAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
ip = request.getRemoteAddr();
}
return ip;
}
如果是用反向代理技術的話request.getHeader("x-forwarded-for");會有值,
一般情況下,只要request.getRemoteAddr();就可以了。
2:獲取MAC:
public String getMACAddress(String ip) {
String str = "";
String macAddress = "";
try {
Process p = Runtime.getRuntime().exec("nbtstat -a " + ip);
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (int i = 1; i < 100; i++) {
str = input.readLine();
if (str != null) {
//if (str.indexOf("MAC Address") > 1) {
if (str.indexOf("MAC") > 1) {
macAddress = str.substring(
str.indexOf("=") + 2, str.length());
break;
}
}
}
} catch (IOException e) {
e.printStackTrace(System.out);
}
return macAddress;
}

通過命令nbtstat -a ip來獲得該ip相對應的mac地址。

8、java如何獲取其它用戶登錄的真是IP地址

1、如果伺服器如果沒有採用反向代理,而且客戶端有用正向代理的話,那麼通過.getRemoteAddr()獲取客戶端的IP地址是客戶端 的代理伺服器的地址,並不是客戶端的真實地址,
2、如果客戶端使用的是多層代理的話,伺服器獲得的客戶端地址是客戶端的最外圍代理伺服器的地址如果伺服器如果採用反向代理伺服器,不管客戶端採用的是何種方式訪問伺服器。
//獲得客戶端真實IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
//獲得客戶端真實IP地址的方法二:
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

9、nginx做反向代理負載均衡 Java怎麼獲取後端伺服器獲取用戶IP

proxy_redirect 復off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
打開你的制nginx.conf文件,找到類似配置項,核對一下是否有以上幾個配置,以上配置中第2、3兩行是解決你的問題的配置。

加入這兩行,在java中就可以通過request.getRemoteHost()或其它方法取到客戶端用戶的入站IP,否只能取nginx伺服器的ip。

與javaip代理伺服器相關的知識