手机终端开发相关技巧收集

手机终端开发相关技巧

GPRS: Opera + Proxomitron


1. ProxN45J.zip 解压后创建一个 Proxomitron.exe 桌面快捷方式。

2. Opera(9.20) http、https 代理服务器 127.0.0.1 端口 80,并选上为代理启用 http 1.1

3. 在 Opera 地址栏输入 opera:config,查找 http accept charset,删除其内容,保存。

运行 Proxomitron、Opera 浏览网页基本都可以了、比较快。xml 解析错误、乱码、淘宝...

不同地区 Proxomitron 设置可能有所不同。

较好的方法是 TCP tunnel for HTTP proxies,ccproxy、httport、desproxy 都可以,有的地区因 tcp socket 大小的限制(内建的 socks 4 是有缺陷的),少数页面不能完整打开,不可下载用。例如可用此方法先登陆论坛,正确 cookie 后再使用第一种方法登陆,此外 windows messenger、tm...

物尽其凑合用吧...

nokia  的模拟器
nS60_jme_sdk_3rd_e_FP1.zip
j2me_wireless_toolkit-2_2-ml-windows.exe

装上飞信等

如果java 可以,可以自己写个代理
这样想改什么头就可以改什么头了
个Proxomitron.exe
cmwap的头有什么特征,我只在书上看到过
网上查得到的,联通和移动的都不一样


1.JDK

 

当前版本

http://java.sun.com/javase/downloads/index.jsp

 

原来版本

http://java.sun.com/javase/downloads/previous.jsp

 

 

2.WTK

 

当前版本

http://java.sun.com/javame/downloads/index.jsp

 

原来版本

http://java.sun.com/javame/downloads/previous.jsp

 

 

3.索爱WTK

 

SE WTK 2.2.4

http://ftpapp.kpimdp.com/StreamD ... %0AwNpNmS3Ldg%3D%3D

 

4.摩托罗拉SDK

 

Motorola J2ME SDK v6.4 for Motorola OS Products

https://developer.motorola.com/docstools/sdks/motorola64/motorola_64_SDK.zip/

 

5.三星

http://developer.samsungmobile.com/Developer/resources/board_list.jsp

 

6.诺基亚

 

开发者套件

http://forum.nokia.com/info/sw.n ... e-aa5cd26be54e.html

 

原型SDK

http://www.im.cyu.edu.tw/tech/hcchiu/J2ME/doc/nptsdk_jme_v4_0.zip

 

Carbide.j 1.5

http://forum.nokia.com/info/sw.n ... e-aa5cd26be54e.html

 

S40

http://forum.nokia.com/info/sw.nokia.com/id/cc48f9a1-f5cf-447b-bdba-c4d41b3d05ce/Series_40_Platform_SDKs.html

 

S60 SDK(如果是第二版,看清小版本号,不要下错了!)

http://forum.nokia.com/info/sw.n ... an_OS_for_Java.html

 

第一版

用户名:shuijingtiantang

密码:jGTvNIDXSW5oQcnQWFqGb+GVx7g=

 

第三版

用户名:shuijingtiantang

密码:WS8VDABut6BgEW1S1XnTAVLyL5w=


 


S60 3rd Edition FP1

http://sw.nokia.com/id/02055bc6-76c6-4bf3-adc6-216b9de0514e/nS60_jme_sdk_3rd_e_FP1.zip

 

7210 SDK

http://sw.nokia.com/id/74104661- ... 10_jme_sdk_v1_0.zip

用户名:shuijingtiantang

密码:qJt2AJgHGtAdbN3HEmjAa5RwD88=

 

7.Netbeans

 


http://www.netbeans.info/downloads/start.php

 

8.Eclipse & EcliseMe

 

Eclipse

http://www.eclipse.org/downloads/


 

EclipseMe

http://sourceforge.net/project/showfiles.php?group_id=86829

 

java 实现Http代理

 

我们将会使用最原始的想法来介绍整个流程,我们觉得下一步程序该做什么,我们才会写什么样的代码,而不是一开始就把所有的问题都想到, 然后画出流程图,那样的方式对于我们去一个从来没写过的程序来说比较难,我们用最简单的方式来思考问题。
前面,我们已经拿到了HttpRequest对象,这个是我们自己封装出来的对象,那么接下来的事情应该是我们根据这个请求对象,把请求发给真正的主机,然后呢,我们从真正的主机那里拿到响应,再把响应发给原始的客户机,这样我们中转的功能就完成了,流程比较简单。
接下来我们写一个Dispatcher得类用于完成转发:
package com.icss.http.server.proxy;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import com.icss.http.HttpRequest;
import com.icss.http.HttpResponse;
import com.icss.http.HttpResponseFactory;

/**
 *
 * <p>Title: Dispatcher</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: 中软国际</p>
 * @author chenyankui
 * @version 1.0
 */
public class Dispatcher
{
    public String host = null;
    public int port = 80;
  
    private HttpProxyServer httpProxyServer = null;
  
    public Dispatcher(){}
  
    /**
     *
     * @param host
     * @param port
     */
    public Dispatcher(HttpProxyServer hps, String _host, int _port)
    {
        this.host = _host;
        this.port = _port;
        this.httpProxyServer = hps;
    }
  
    /**
     *
     * @param request - void
     * @author: chenyankui
     */
    public void dispatch(HttpRequest request)
    {
        Socket socket = null;
      
        try
        {
            socket = this.createSocket(host, port);
          
            InputStream socketInputStream   = socket.getInputStream();
            OutputStream socketOutputStream = socket.getOutputStream();
          
            this.request(request, socketOutputStream);
          
            HttpResponse httpResponse = HttpResponseFactory.read(socketInputStream, socketOutputStream);
          
            this.resonse(httpResponse, request.getOutputStream());
        }
        catch(IOException e)
        {
            System.out.println("Warning: " + e.getMessage());
        }
        finally
        {
            if(socket != null)
            {
                try
                {
                    socket.close();
                }
                catch(IOException e){}
            }
        }
    }
  
    /**
     *
     * @param request
     * @throws IOException
     * @author: chenyankui
     */
    private void request(HttpRequest request, OutputStream outputStream) throws IOException
    {
        /* 对请求头进行修改 */
        this.updateHttpRequest(request);
      
        String headers = request.toString();
      
        System.out.print("------------------ 修改后的请求头 ------------------/r/n" + headers);
      
        /* 写请求头 */
        outputStream.write(headers.getBytes());
      
        /* 将输入数据传输到服务器 */
        ContentPump.pumpContentStream(request.getInputStream(), outputStream, request.getContentLength());
    }
  
    /**
     *
     * @param response
     * @throws IOException - void
     * @author: chenyankui
     */
    private void resonse(HttpResponse response, OutputStream outputStream) throws IOException
    {
        /* 修改响应头 */
        this.updateHttpResponse(response);
      
        String headers = response.toString();
      
        System.out.print("------------------ 修改后的响应头 ------------------/r/n" + headers);
      
        outputStream = new com.icss.io.PoolOutputStream(new OutputStream[]{outputStream, System.out});
      
        /* 写响应头 */
        outputStream.write(headers.getBytes());
      
        /* 是否使用Chunk */
        if(response.getHeader("Transfer-Encoding") != null)
        {
            InputStream inputStream = response.getInputStream();
          
            ChunkedPump.pumpChunkedStream(inputStream, outputStream);
        }
        else
        {
            InputStream inputStream = response.getInputStream();
          
            ContentPump.pumpContentStream(inputStream, outputStream, response.getContentLength());
        }
      
        outputStream.flush();
    }
  
    /**
     *
     * @param host
     * @param port
     * @return
     * @throws IOException - Socket
     * @author: chenyankui
     */
    private Socket createSocket(String host, int port) throws IOException
    {
        InetAddress inetAddress = InetAddress.getByName(host);
      
        return new Socket(inetAddress, port);
    }
  
    /**
     *
     * @param _host
     * @param _port
     * @return - String
     * @author: chenyankui
     */
    private String getHostPort(String _host, int _port)
    {
        if(_port > 0 && _port < 65536 && _port != 80)
        {
            _host += ":" + _port;
        }
      
        return _host;
    }
  
    /**
     *
     * @param request - void
     * @author: chenyankui
     */
    private void updateHttpRequest(HttpRequest request)
    {
        String header = request.getHeader("Host");
      
        if(header != null)
        {
            request.setHeader("Host", getHostPort(this.host, this.port));
        }
      
        header = request.getHeader("Referer");
      
        if(header != null)
        {
            header = this.replaceHostPort(header, this.host, this.port);
          
            request.setHeader("Referer", header);
        }
    }
  
    /**
     *
     * @param response - void
     * @author: chenyankui
     */
    private void updateHttpResponse(HttpResponse response)
    {
        String header = response.getHeader("Location");
      
        if(header != null)
        {
            header = this.replaceHostPort(header, httpProxyServer.getHost(), httpProxyServer.getPort());
          
            response.setHeader("Location", header);
        }
    }
  
    /**
     *
     * @param srcUrl
     * @param _host
     * @param _port
     * @return - String
     * @author: chenyankui
     */
    private String replaceHostPort(String srcUrl, String _host, int _port)
    {
        try
        {
            URL url = new URL(srcUrl);
          
            String path  = url.getPath();
            String query = url.getQuery();
          
            if(query != null && query.length() > 0)
            {
                path += "?" + query;
            }
          
            if(_port > 0 && _port < 65536 && _port != 80)
            {
                _host += ":" + _port;
            }
          
            return "http://" + _host + path;
        }
        catch(MalformedURLException e)
        {
            e.printStackTrace();
        }
      
        return srcUrl;
    }

    protected String getHost()
    {
        return this.host;
    }

    protected void setHost(String host)
    {
        this.host = host;
    }

    protected int getPort()
    {
        return this.port;
    }

    protected void setPort(int port)
    {
        this.port = port;
    }

    protected HttpProxyServer getHttpProxyServer()
    {
        return this.httpProxyServer;
    }

    protected void setHttpProxyServer(HttpProxyServer httpProxyServer)
    {
        this.httpProxyServer = httpProxyServer;
    }
  
    public static void main(String[] args)
    {
        Dispatcher d = new Dispatcher();
      
        String x = null;
      
        x = d.replaceHostPort("http://127.0.0.1:8080", "192.168.1.6", 7272);
      
        System.out.println(x);
      
        x = d.replaceHostPort("http://127.0.0.1:8080/", "192.168.1.6", 7272);
      
        System.out.println(x);
      
        x = d.replaceHostPort("http://127.0.0.1:8080/test.jsp", "192.168.1.6", 7272);
      
        System.out.println(x);
    }
}


来自:linux宝库
联系:linuxmine#gmail.com
分类:[J2ee核心]

baidu

  
在J2ME网络程序开发过程中,为了节约用户支付的网络费用,很多J2ME手机网络程序都支持CMWAP代理。

  

  

但是由于CMWAP只是中国移动建立的一个HTTP网络服务器,所以在使用HTTP网络编程中,可以很方便的使用。但是在使用socket方法操作时,这个方式好象就行不通了。

  

  

下面就介绍一下如何使用socket连接来穿越CMWAP代理。其实由于CMWAP是一个标准的HTTP代理服务器,也就是说可以处理任何的基于HTTP协议的转发请求,那么就可以使用socket方式编程时使用HTTP协议即可了。

  

  

实现原理:使用socket和CMWAP建立连接,然后将网络协议设计成HTTP协议的格式,这样CMWAP就可以继续实现请求的转发了,这就是实现的基本原理。

  

  

当然,由于socket连接方式可以实现持续连接,这里的持续连接只存在于手机和CMWAP之间,但是可以只建立一次连接就实现多次的发送,还是基于请求-响应结构实现的,所以可以说实现了一部分socket的功能,而服务器端可以采用已有的HTTP服务器,从而降低开发成本和时间。

  

  

该技术的优势主要有以下几点:

  

  

u 使用CMWAP进行数据传输,可以为用户节约流量费用。

  

  

u 由于手机和CMWAP之间建立的是持续连接,所以可以提高网络响应速度。

  

  

u 使用该方式,可以实现服务器端兼容HTTP连接和socket连接,也就是使用一组服务器,降低开发成本和减少开发时间。

  

  

实现网络操作的代码如下所示:

  

package cmwaptest;

  

import java.io.*;

  

import javax.microedition.io.*;

  

/**

  

* 测试使用socket连接穿越CMWAP服务器

  

*/

  

public class CmwapThread extends Thread{

  

CmwapForm cf;

  

public CmwapThread(CmwapForm cf){

  

this.cf = cf;

  

}

  

 

  

public void run(){

  

try{

  

//测试

  

cf.displayInfo("开始建立连接!");

  

//使用代理连接

  

SocketConnection sc = (SocketConnection)Connector.open("socket://10.0.0.172:80");

  

 

  

//测试

  

cf.displayInfo("连接建立完毕!");

  

//发送数据

  

OutputStream os = sc.openOutputStream();

  

String requestLine = "get http://www.freewebs.com/cqucyf/a.htm http/1.0/r/n";

  

String header = "accept:*/*/r/n/r/n";

  

 

  

os.write(requestLine.getBytes());

  

os.write(header.getBytes());

  

os.flush();

  

 

  

//测试

  

cf.displayInfo("数据发送完毕!");

  

 

  

//接收数据

  

InputStream is = sc.openInputStream();

  

byte[] data = new byte[10240];

  

int num = is.read(data);

  

//测试

  

cf.displayInfo("数据接受完毕!" + "数据长度为:"+ num);

  

//处理数据

  

cf.doStr(data,num);

  

 

  

sc.close();

  

}catch(Exception e){

  

//e.printStackTrace();

  

cf.doError(e.toString());

  

}

  

}

  

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值