J2me访问c# Web Services

J2me访问c#  Web Services

任务:用j2me访问.NET写的web服务,并解决中文传输问题
分析:java的默认编码是iso-8859-1,.NET的默认编码是utf-8,因为我们的webservice的web方法的参数是由j2me来提供,而且也可能是中文字符,而且返回值也可能是中文字符,所以要保证服务端和客户端都能正常解码中文,而j2me里的httpconnection类访问web服务的时候默认编码不是gb2312,所以要设置一下。
准备:
下载jdk1.6,netbeans4.1,mobility pack4.1,WTK2.3文件列表如下
jdk-6-rc-bin-b66-windows-i586-05_jan_2006.exe
netbeans-4_1-windows-ml_zh_CN.exe
netbeans_mobility-4_1-win_zh_CN.exe
sun_java_wireless_toolkit-2_3-beta-windows.exe
先安装jdk,再安装WTK,然后安装netbeans,最后安装mobility pack,安装netbeans和mobility的时候会自动搜索jdk类库,指定一下就行了。
另外最好熟悉一下j2me的简单开发
用.NET创建web服务
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace WebService1
{

 public class Service1 : System.Web.Services.WebService
 {
  public Service1()
  {
   InitializeComponent();
  }
  
  private IContainer components = null;
    
  private void InitializeComponent()
  {
  }

  protected override void Dispose( bool disposing )
  {
   if(disposing && components != null)
   {
    components.Dispose();
   }
   base.Dispose(disposing);  
  }
  
  [WebMethod]
  public string Hello(string str)
  {   
   return "你好:" + str;
  }
 }
}

设置web.config的http编码部分
<globalization requestEncoding="gb2312" responseEncoding="gb2312" />
默认.net 1.1的web服务没有打开get和post模式,打开它
<system.web>
  <webServices>
   <protocols>
    <add name="HttpGet" />
    <add name="HttpPost" />
   </protocols>
  </webServices>
用J2ME写客户端调用程序
打开netbeans,新建移动程序,新建一个com.sun.j2me包,然后新建一个MIDlet,名字叫MIDlet,键入以下代码
/*
 * HttpTest.java
 *
 * Created on 2006年3月6日, 下午3:30
 */

package com.sun.j2me;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
import java.lang.String;


/**
 *
 * @author  蛙蛙王子
 * @version
 */
public class HttpTest extends MIDlet
{

private Display display;

public HttpTest()
{
display = Display.getDisplay(this);
}

protected void startApp() throws MIDletStateChangeException
{
    HttpConnection hc = null;
    DataInputStream dis = null;
    try {

            String url = "http://localhost/WebService1/Service1.asmx/Hello?str=呱呱";
            hc = (HttpConnection)Connector.open(url);
            hc.setRequestProperty("content-type", "text/html;charset=gb2312"); //这里要设置charset
            int len = (int)hc.getLength();
            dis = new DataInputStream(hc.openInputStream());     
            if (len > 0) {
                byte[] myData = new byte[len];
                dis.readFully(myData);
                String content="";            
                dis.read(myData,0,myData.length);
                content = new String(myData,"UTF-8"); //这里转换成UTF-8编码
                Form f = new Form("HTTP Test");
                f.append(content);
                display.setCurrent(f);
            }           
        }
        catch(Exception e)
        {
            System.out.println(e.toString()) ;
            notifyDestroyed();
        }
        finally
        {
            try{
                if(hc!=null)
                    hc.close();
                if(dis!=null)
                    dis.close();
            }catch(Exception e){
                System.out.println("关闭错误");
            }
        }

}


protected void pauseApp()
{
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
}
按F6就可以运行你的程序了,点击模拟器的启动键,测试你的程序,可以看到web服务返回的XML字符串,然后你可以进入java里相应的XML操作的类来解析返回的XML来获取指定节点的数据并进一步执行业务逻辑。
小节:
一般来说解决中文问题,传输数据的时候不要考虑编码问题,只传输字节流,客户端读取字节流后根据相应的编码协议进行解析,一边是GB2312另一边也是GB2312。如果web服务和客户端都是java的话,可以一边用WRITEUTF(),另一边用READUTF(),就简单多了。

posted @ 2006-03-29 18:45  蛙蛙王子  Views(1594)  Comments(0Edit  收藏  举报