0
点赞
收藏
分享

微信扫一扫

J2me访问c# Web Services

minute_5 2022-01-25 阅读 39

任务:用j2me访问.NET写的web服务,并解决中文传输问题 分析:java的默认编码是iso-8859-1,.NET的默认编码是utf-8,因为我们的webservice的web方法的参数是由j2me来提供,而且也可能是中文字符,而且返回值也可能是中文字符,所以要保证服务端和客户端都能正常解码中文,而j2me里的httpconnection类访问web服务的时候默认编码不是gb2312,所以要设置一下。


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



举报

相关推荐

0 条评论