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(),就简单多了。