zoukankan      html  css  js  c++  java
  • 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(),就简单多了。

  • 相关阅读:
    程序员如何判断是否到了该辞职的时候?
    牛客网
    C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
    为什么构造函数不能声明为虚函数,析构函数可以
    为什么要线程同步,说出线程同步的几种方法
    内存字节对齐
    std::map的删除
    阻塞调用ShellExecute函数
    无法打开包括文件:“SDKDDKVer.h”: No such file or directory
    Legacy C++ MongoDB Driver
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/362009.html
Copyright © 2011-2022 走看看