java如何通过IP跳转到java服务器端开发?

用一台广域网的服务器,客户端在局域网内部,客户端登录后要连接到服务器,然后可以和服务器之间接受发送消息。
能不能这样实现:在服务器上new ServerSocket(1234);客户端上直接new Socket("服务器IP", 1234);局域网内两台机器可以,但广域网不知道行不行? 网上说TCP打洞,但是没有java方面的
采纳的答案
tcp打洞就java可以实现
首先就是2台机器都连接一个server1 这样这个server1就有了这两台机器的真正广域网ip 然后server1把内网和外网的ip互换交给内外网的两个server,然后内网server向外网的那个服务器请求一个连接 这样可以打开内网对外网那个server的访问开关 外网的server就可以访问连接内网了
外网地址是路由器分配的 所以和程序无关 你不用担心 它可以通过广域网ip自动影射到你的内网server。
只要客户端能够找到服务器就可以了,换言之,服务器的IP是公网IP就ok了
你要访问哪个端口,在路由器上开放指定端口就可以。打洞还没试过,我做的时候都是开放路由端口的。
String ip = request().getHeader("X-Forwarded-For");
System.out.println(request().getRemoteAddr() + (ip == null ? "" : "/ " + ip));
客户端跟服务器建立socket连接后,其实就是建立了双向的连接,双方就可以正常的交换数据了。
至于服务器发送的数据怎么通过外网进入到对应的内网客户端,主要是在你的局域网入口(如,路由器)里通过NAT协议来实现的,这个跟java无关。具体的NAT协议可以到网上搜一下,资料还蛮多的,如:
/view/16102.htm
已解决问题
未解决问题java 服务器获取请求的IP方法之总结 - songylwq的专栏
- 博客频道 - CSDN.NET
4863人阅读
项目中需要和第三方平台接口,加了来源IP鉴权功能,测试时发现没有问题,但是部署以后发现存在问题,一直鉴权不通过,一群人抓瞎。
我找到那块的代码,跟了一遍流程发现逻辑没有啥问题,但是最终的结果却还是鉴权不通过,实在有些诡异。其基本逻辑为先取得配置的IP列表,然后通过request.getRemoteAddr()取得客户端的IP地址,做鉴权和校验,逻辑没问题,那么肯定是request.getRemoteAddr()出了问题,google下,发现有人遇到类似的问题。
最终定位为request.getRemoteAddr()这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将 的URL反向代理为/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
原来如此,我们的项目中正好是有前置apache,将一些请求转发给后端的weblogic,看来就是这样导致的咯。
给出一份还算靠谱的代码
改进后的java代码:
class IpUtils {
public static 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.getHeader(&HTTP_CLIENT_IP&);
if (ip == null || ip.length() == 0 || &unknown&.equalsIgnoreCase(ip)) {
ip = request.getHeader(&HTTP_X_FORWARDED_FOR&);
if (ip == null || ip.length() == 0 || &unknown&.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
PS:可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100,用户真实IP为: 192.168.1.110
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:576076次
积分:6628
积分:6628
排名:第1344名
原创:144篇
转载:121篇
评论:100条
(1)(3)(13)(2)(1)(4)(1)(1)(1)(8)(1)(1)(1)(5)(4)(5)(1)(3)(1)(9)(4)(4)(3)(3)(2)(9)(5)(8)(2)(6)(2)(4)(2)(3)(6)(11)(18)(12)(5)(12)(6)(21)(5)(47)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分22 UID阅读权限10积分26帖子精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
白手起家, 积分 26, 距离下一级还需 174 积分
帖子主题精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
论坛徽章:0
本帖最后由 wsx1011 于
12:28 编辑
用java做socket(TCP/IP协议)开发应用执行效率怎么样?这样做的多么?
就是想让用tomcat+jsp+java 做的web服务器通过socket与另一个操作数据库的server通讯,获取查询结果后再传给客户端浏览器,这样执行效率会怎么样?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分2 信誉积分2625 UID7789873阅读权限90积分21346帖子精华可用积分21346 专家积分11 在线时间6407 小时注册时间最后登录
巨富豪门, 积分 21346, 距离下一级还需 18654 积分
帖子主题精华可用积分21346 专家积分11 在线时间6407 小时注册时间最后登录
论坛徽章:39
不知道多不多啊。
要看业务情况。
用java写socket没什么问题。
空间积分0 信誉积分1655 UID8804348阅读权限90积分16915帖子精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
大富大贵, 积分 16915, 距离下一级还需 3085 积分
帖子主题精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
论坛徽章:4
本帖最后由 yulihua49 于
16:12 编辑
wsx1011 发表于
用java做socket(TCP/IP协议)开发应用执行效率怎么样?这样做的多么?
就是想让用tomcat+jsp+java 做的 ...
好主意。可以采用SDBC交易中间件。 到SDBC群下载。
就是用JAVA版的SDBC客户端,呼叫C的数据库服务端,支持ORACLE,DB2,MYSQL,SYBASE。
与JDBC的区别,更安全,更高效。
除了数据库的基本操作,还可以在服务端定义自己所需的操作。即,可以加入任何业务逻辑插件。
欢迎到我的blog:http://blog.chinaunix.net/uid/8804348.html
空间积分0 信誉积分1073 UID阅读权限20积分581帖子精华可用积分581 专家积分0 在线时间415 小时注册时间最后登录
丰衣足食, 积分 581, 距离下一级还需 419 积分
帖子主题精华可用积分581 专家积分0 在线时间415 小时注册时间最后登录
论坛徽章:0
一般这种情况用HTTP比较多,类似soap。 jsp,或者asp,php,python等都可以直接发http get或post的,接口灵活。
如果是纯粹的网络程序,java的socket通信比起c/c++还是稍弱了一些,毕竟,中间要经过java虚拟机。还有,如果做图像处理,视频等对内存要求比较大的时候,JAVA也有麻烦。
空间积分0 信誉积分1654 UID阅读权限90积分38038帖子精华可用积分38038 专家积分0 在线时间1976 小时注册时间最后登录
巨富豪门, 积分 38038, 距离下一级还需 1962 积分
帖子主题精华可用积分38038 专家积分0 在线时间1976 小时注册时间最后登录
论坛徽章:4
可以用RPC库或者自己裸写SOCKET搞定,操作数据库这种偏IO,用JAVA没什么问题。
专注linux服务端性能与架构设计...
空间积分0 信誉积分22 UID阅读权限10积分26帖子精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
白手起家, 积分 26, 距离下一级还需 174 积分
帖子主题精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
论坛徽章:0
有个难题,SQL语句怎么传才能让对方正确识别?比如查询一个表里的name和age字段,对方收到后怎么知道是查询这两个字段?
空间积分0 信誉积分1655 UID8804348阅读权限90积分16915帖子精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
大富大贵, 积分 16915, 距离下一级还需 3085 积分
帖子主题精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
论坛徽章:4
本帖最后由 yulihua49 于
22:21 编辑
wsx1011 发表于
回复 3# yulihua49
有个难题,SQL语句怎么传才能让对方正确识别?比如查询一个表里的name和age字段,对 ...
发完整的SQL语句,返回时结果集序列化,如采用JSON格式,自带列名。
如采用prepare方式,可以分批返回结果集,但是形成了有状态服务。
发prepare 语句,返回游标(cursor) --- 进入状态。
发 Fetch指令,返回一组结果 --- 继续状态
继续发Fetch指令,再返回一组结果 --- 继续状态
。。。。。
发close cursor指令& &&&---------结束状态。
这个序列只有SDBC交易中间件支持。其他交易中间件如TUXEDO、东方通等不支持。
一般的webservice是不支持状态的。
欢迎到我的blog:http://blog.chinaunix.net/uid/8804348.html
空间积分0 信誉积分22 UID阅读权限10积分26帖子精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
白手起家, 积分 26, 距离下一级还需 174 积分
帖子主题精华可用积分34 专家积分0 在线时间8 小时注册时间最后登录
论坛徽章:0
如果对方是用C语言写的服务器呢?
空间积分0 信誉积分1655 UID8804348阅读权限90积分16915帖子精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
大富大贵, 积分 16915, 距离下一级还需 3085 积分
帖子主题精华可用积分16915 专家积分5 在线时间1878 小时注册时间最后登录
论坛徽章:4
本帖最后由 yulihua49 于
10:08 编辑
wsx1011 发表于
回复 7# yulihua49
如果对方是用C语言写的服务器呢?
SDBC就是C的服务器+C的客户端+JAVA的客户端。
其中预置了数据库服务,和文件传送服务,还可以自己添加所需的服务。
当然,SDBC实现的功能,其他方法理论上也可以实现。但是要做许多的工作。
看看JAVA调ORACLE存储过程的代码,有状态服务,返回游标:public int test_rpc()
& & & & {
& & & & & & & & int i,
& & & & & & & & SdbcClient sqlc=new SdbcClient(mid);
& & & & & & & & BUS bus=new BUS(pattern);
& & & & & & & & PAGE page=new PAGE(pattern);
& & & & & & & & byte[]
& & & & & & & & Rowno rowno=new Rowno(pattern);
& & & & & & & & String rpccmd=&test_buspage.datapage(' ',1,20,' ',:cursor,:char(100),:cursor,:char(100))&;
& & & & & & & & StringBuffer retval=new StringBuffer(100);
& & & & & & & & int nrets[]=new int[1];
& & & & & & & & i=sqlc.RPC(rpccmd, retval, nrets, 2);
& & & & & & & & if(i==0) {
//& &&&retval= &1|2|2||&
& & & & & & & & & & & & System.out.println(&retval=&+retval+&,nrets=&+nrets[0]);
& & & & & & & & & & & & String s[]=retval.toString().split(&\\|&);
//第一个游标& & & & & & & & & & & &
& & & & & & & & & & & & int cursor= Integer.parseInt(s[0]);
& & & & & & & & & & & & sqlc.Fetch(cursor, retval, 0);
& & & & & & & & & & & & System.out.println(retval.toString()+&,rows=&+sqlc.Rows);
//& & & & & & & & & & & & System.out.println(&这么大的一堆,让我怎么解析呢?下边演示用SdbcPack类解析:&);
& & & & & & & & & & & & result=retval.toString().getBytes();
& & & & & & & & & & & & pos=0;
& & & & & & & & & & & & for(i=0;i&sqlc.Ri++) {
& & & & & & & & & & & & & & & & pos=SdbcPack.unpack(bus,result , pos);
//比表结构多了一个rowno
& & & & & & & & & & & & & & & & pos=SdbcPack.unpack(rowno,result,pos);
//现在可以使用这个bus啦
& & & & & & & & & & & & & & & & System.out.println(&BUS[&+rowno.getRow_no()+&]=&+Jorm.objectToJsonString(bus));
& & & & & & & & & & & & }
& & & & & & & & & & & & sqlc.Close_Cursor(cursor);
//第二个游标
& & & & & & & & & & & & cursor= Integer.parseInt(s[2]);
& & & & & & & & & & & & sqlc.Fetch(cursor, retval, 0);
& & & & & & & & & & & & System.out.println(retval.toString()+&,rows=&+sqlc.Rows);
& & & & & & & & & & & & result=retval.toString().getBytes();
& & & & & & & & & & & & pos=0;
& & & & & & & & & & & & for(i=0;i&sqlc.Ri++) {
& & & & & & & & & & & & & & & & pos=SdbcPack.unpack(page, result, pos);
& & & & & & & & & & & & & & & & pos=SdbcPack.unpack(rowno,result,pos);
//现在可以使用这个page啦
& & & & & & & & & & & & & & & & System.out.println(&PAGE[&+rowno.getRow_no()+&]=&+Jorm.objectToJsonString(page));
& & & & & & & & & & & & }
& & & & & & & & & & & & sqlc.Close_Cursor(cursor);
& & & & & & & & }
& & & & & & & & return 0;
& & & & }复制代码
欢迎到我的blog:http://blog.chinaunix.net/uid/8804348.html
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处当前位置: >
> java webservice 服务器代码怎么获取客户端的IP地址
java webservice 服务器代码怎么获取客户端的IP地址
wgqmvp & at
java webservice 服务器代码如何获取客户端的IP地址 & 只用了JAX-WS 2.1 没用其它web service工具
虽然不太明白你说的,但可以相信,不管采用的是什么技术,只要遵循了Java EE的规范,应该就能采用这些方法吧。JavaEE API文档,ServletRequst接口,有一个 getRemoteAddr()方法,能获取客户端IP地址。
wgqxc2008 & &
& & (0)(0)
通过 @Resource 注入 WebServiceContext 对象,再从 WebServiceContext 对象中使用 getMessageContext() 获得 MessageContext 对象,再使用:ServletRequest request = (ServletRequest)messageContext.get(MessageContext.HTTP_REQUEST);上面这些虽然是 Java EE 5/JAX-WS 2.0 中的方式,我看了一下 JAX-WS 2.1 中也可以使用的,你试试看。所用的接口、Annotation 完整名称为:@Resource: javax.annotation.ResourceWebServiceContext: javax.xml.ws.WebServiceContextMessageContext: javax.xml.ws.handler.MessageContextServletRequest: javax.servlet.ServletRequestwgs1988 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-java如何通过IP跳转到服务器?_百度知道
java如何通过IP跳转到服务器?
如题,java如何通过IP跳转到服务器?
提问者采纳
可以使用脚本语言windows.location.href=”/url”
提问者评价
其他类似问题
没明白这是什么意思,Java是一门编程语言,怎么会跳转?
java的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 java上传图片到服务器 的文章

 

随机推荐