[JavaME]手机申请移动分配的动态IP?(2)

[JavaME]手机申请移动分配的动态IP2?

 

 

 

 

 

 

 

先用ServerSocketConnection.open然后向某服务器询问手机自己的IP

 

       Hi,继续上回的讨论《[JavaME]手机是否能够申请到动态IP?》。

       上回说到申请动态IP的调试顺序可能反了,经过今天的测试,应该是我后面谈到的顺序,而且其中有一步很关键。

总之,每次在真机Nokia7610上测试,通过

"socket://" + ssc.getLocalAddress() +

                                          ":" + ssc.getLocalPort();

得到的Socket地址每次都是10.16.195.219之类的;同时服务器看到的手机访问IP地址都不一样,比如:

211.136.72.122

211.136.74.24

211.136.74.8;

等等。当然,这个地址会不会还是移动自己的几个固定IP。如果真的是这样,不知道端口能否映射过去?比如我访问211.136.72.1228110端口,是否能映射到10.16.195.219:8110端口呢?这是一个未知数.

 

我的Internet服务器上部署了一个很简单的asp页面,用来查看浏览此页面的手机的客户端IP地址。

用下面的asp代码试图得到客户端的IP

 

 

 

 

 

 

 

 

<%

 

 

 

 

 

 

 

    '正常情况Request.ServerVariables ("REMOTE_ADDR")就能取得客户端的IP地址,

 

 

 

 

 

 

 

但如果客户端是使用代理服务器来访问,

 

 

 

 

 

 

 

    '那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址,

 

 

 

 

 

 

 

要想透过代理服务器

 

 

 

 

 

 

 

    '取得客户端的真实IP地址,就要使用

 

 

 

 

 

 

 

    'Request.ServerVariables("HTTP_X_FORWARDED_FOR")来读取,

 

 

 

 

 

 

 

但是需要注意的是:

 

 

 

 

 

 

 

    '如果客户端没有通过代理服务器来访问,

 

 

 

 

 

 

 

那么用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR")

 

 

 

 

 

 

 

    '取到的值将是空的。

 

 

 

 

 

 

 

Ip_address = Request.ServerVariables ("HTTP_X_FORWARDED_FOR")

 

 

 

 

 

 

 

        If Ip_address = "" Then

 

 

 

 

 

 

 

           Ip_address= Request.ServerVariables ("REMOTE_ADDR")

 

 

 

 

 

 

 

        end if

 

 

 

 

 

 

 

        Response.Write "Client IP Address=" & Ip_address

 

 

 

 

 

 

 

%>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下面给出具体的思路以及代码:

首先,我们还是利用

用下面的代码可以得到一个socket 动态IP

 

 

 

 

 

 

 

 

String url = "socket://:" + m_sSocketPort;

 

 

 

 

 

 

 

ServerSocketConnection ssc = null;

 

 

 

 

 

 

 

try

 

 

 

 

 

 

 

{              

 

 

 

 

 

 

 

         // 先去访问网站,从而争取获得一个外部IP地址,而不是127.0.0.1

 

 

 

 

 

 

 

         OutboundConnection(m_sInternetUrl);

 

 

 

 

 

 

 

     //Open the connection.

 

 

 

 

 

 

 

     ssc =

 

 

 

 

 

 

 

        (ServerSocketConnection) Connector.open(url);

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

来试图“get the dynamically assigned address from the getLocalAddress() and getLocalPort() methods”。

这是我们起的第一个线程ThreadRegisterIP,这之后,ThreadRegisterIP可以通过PushRegistry.registerConnection来注册监听;也可以调用(SocketConnection) ssc.acceptAndOpen();等候其他人来访问这个socket端口,这样会导致线程ThreadRegisterIP处于listen状态。

特别值得关注的一点是,在(ServerSocketConnection) Connector.open(url)之前,我发现必须先去用HttpConnection看看一个Internet网站,然后再来ServerSocketConnection.open,这样才能够正确拿到socket://10.16.195.219:8110。不这么做,就会得到socket://127.0.0.1:8110这种地址。

 

 

 

 

 

 

 

ServerSocketConnection之后呢,我们另外起一个ThreadAskServerIP线程,它呢,发送HttpConnection.GET请求给我的服务器网页,这个网页会告诉我服务器看到的IP地址是什么。我把这个IP地址显示在midlet上。

 

上面的代码可以从

http://files.cnblogs.com/zhengyun_ustc/GetDynamicIP-withAskServer.rar

下载;

安装的jar包从

http://files.cnblogs.com/zhengyun_ustc/GetDynamicIP-deployed-withAskServer.rar下载。

本文属于讨论稿,提供的仅仅是建议和测试意见。

本文还可以从

http://www.cnblogs.com/zhengyun_ustc/archive/2005/11/09/ServerSocketConnection2.html 得到最新稿。 

 

在现实测试中,每次这个IP地址都不一样。到底能不能通过这个IP地址找到手机,有待研究。

郑昀@ultrapower

 

 

 

 

 

 

 

 

类别

 

 

 

 

 

 

 

 

编写日期

 

 

 

 

 

 

 

 

Keyword: Mobile dynamicIP j2me midp ServerSocketConnection

 

 

 

 

 

 

 

 

讨论稿

 

 

 

 

 

 

 

 

2005119日星期三

 

 

 

 

 

 

 

 

 

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=526188


你可能感兴趣的:(JavaME)