this is a extra element for clear the floated element
实例分析J2ME网络编程的两种方法
  • 12/31
  • 2008
核心技术 | Java 1874 次查看
  本文描述了在J2me中开发主要使用的网络连接方法,分别详细介绍了使用http和socket两种方法。

  HttpConnection

  首先我们先来看一个简单的例子吧:

  主要用到的java包:

  javax.microedition.io.*;

  public

  String

  requestGET(String

  URLString,String

  URL)

  throws

  IOException{

  //

  =====================================

  //

  URLString是HTTP地址,URL为后面的参数

  //

  这里的例子是发送用的用户名和密码到服务器端进行用户验证

  //

  比如

  String

  URLString

  =

  "http://192.168.0.1:8080/login.jsp";

  //

  String

  URL

  =

  "?Name="+this.txtName+"&Pass="+this.txtPass

  //

  =====================================

  HttpConnection

  hpc

  =

  null;

  DataInputStream

  dis

  =

  null;

  boolean

  newline

  =

  false;

  String

  content

  =

  "";

  try{

  //

  =====================================

  //

  建立连接

  //

  =====================================

  hpc

  =

  (HttpConnection)Connector.open(URLString+URL);

  hpc.setRequestMethod(HttpConnection.GET);

  dis

  =

  new

  DataInputStream(hpc.openInputStream());

  int

  character;

  //

  =====================================

  //

  读取返回的HTTP内容

  //

  ====================================

  while((character

  =

  dis.read())

  !=

  -1){

  if((char)character

  ==

  '\\'){

  newline

  =

  true;

  continue;

  }

  else{

  if((char)character

  =='n'&&

  newline){

  content

  +="\n";

  newline

  =

  false;

  }

  else

  if(newline){

  content

  +="\\"

  +(char)character;

  newline

  =

  false;

  }

  else{

  content

  +=(char)character;

  newline

  =

  false;

  }

  }

  }

  }

  catch(IOException

  e){

  System.out.print("ERROR:"+e);

  }

  finally{

  if(hpc

  !=

  null){

  hpc.close();

  hpc

  =

  null;

  }

  if(dis

  !=

  null){

  dis.close();

  }

  }

  //

  ====================================

  //

  由于内容可能有中文,所以在接受到信息后要对内容进行字符集的转换

  //

  ====================================

  content

  =

  (unicodeTogb2312(content)).trim();

  return

  content;

  }

  public

  static

  String

  unicodeTogb2312(String

  s){

  if

  (s==null){

  return

  "";

  }

  if

  (s.equals("")){

  return

  s;

  }

  try{

  return

  new

  String(s.getBytes("ISO8859_1"),"gb2312");

  }

  catch(Exception

  uee){

  return

  s;

  }

  }

  以上就是一个简单的HTTP连接并且从服务器获取响应信息的例子,应该很简单了吧。客户端就是上面那个样子,服务器端只要配置好IIS,增加一个网页来对客户端的请求做出响应就行了,其实跟一般的网页请求没有多大区别,很简单吧!!

  上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:

  SocketConnection

  下面还是从实例入手讲一下J2me的Socket编程。

  程序首先打开以IP地址为192.168.0.1:6666的Socket连接,如果连接失败则抛出异常,程序结束。如果Socket连接成功,则继续。

  public

  boolean

  SocketConn(String

  s)

  throws

  IOException{

  //

  ==================================

  //

  s是Socket连接字符串

  //

  这里的例子是发送用的用户名和密码到服务器端进行用户验证

  //

  比如

  String

  s

  =

  "socket://192.168.0.1:6666"

  //

  ==================================

  private

  StreamConnection

  conServer;

  private

  String

  strServerAddr;

  private

  boolean

  bConnected;

  conServer

  =

  null;

  strServerAddr

  =

  s;

  //

  连接地址

  bConnected

  =

  false;

  //

  连接状态

  try

  {

  conServer

  =

  (StreamConnection)Connector.open(strServerAddr);

  }

  catch(Exception

  exception)

  {

  System.out.println("Connect

  server

  error");

  bConnected

  =

  false;

  return

  false;

  }

  bConnected

  =

  true;

  System.out.println("connect

  ok!");

  return

  true;

  }

  上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:

  ..........

  try{

  //

  建立端口为6666的socket服务器

  ServerSocketConnection

  SocketSer;

  SocketSer

  =

  (ServerSocketConnection)Connector.open("socket://:6666");

  //

  等待客户端连接

  SocketConnection

  sc;

  //

  如有连接,则新增一个线程对连接进行处理

  sc

  =

  (SocketConnection)SocketSer.acceptAndOpen();

  ..........

  while(true){

  //

  对sc的InputStream和OutPutStream进行处理

  }

  }

  ..........

  在这里需要说明一下我的看法,手机通过Socket连接上服务器后,由于我用的是中国移动的号码,所以跑的是GPRS通道,我所建立的服务器连接所获得的客户端IP只是一个虚拟IP,而这个IP估计是以用户当前最近的移动机站的编码通过一些变化而产生的,所以当用户不停的移动的时候,IP也许会发生变化(这里我就不太清楚了),有兴趣的可以去看看“移动虚拟IP技术”相关的报道。本来我以前的想法是用户连接到服务器后只要IP不变就可以实现服务器向客户端广播数据,但是这个IP并非是长连接,服务器在广播数据的时候也许会有很大部分的客户端的IP会出现变化,所以最后还是采用由客户端主动发送信息的形式。感觉有点扯远了,还是回到正题吧。

  客户端在建立Socket连接成功后,即可向服务器发送信息,以下是发送信息模块

  protected

  boolean

  sendData(byte

  abyte0[])//自己替换[]

  {

  System.out.println("send

  :"

  +

  bConnected);

  //

  判断连接情况

  if(!bConnected)

  return

  false;

  OutputStream

  outputstream

  =

  null;

  try

  {

  outputstream

  =

  conServer.openOutputStream();

  //

  写信息到outputstream中

  outputstream.write(abyte0);

  //

  我的理解是强制送出所有已经写了的信息

  outputstream.flush();

  outputstream.close();

  }

  catch(Exception

  exception)

  {

  System.out.println("Send

  Data

  error");

  bConnected

  =

  false;

  try

  {

  if(outputstream

  !=

  null)

  outputstream.close();

  //

  调用断开连接的函数

  disconnect();

  }

  catch(Exception

  exception1)

  {

  }

  return

  false;

  }

  return

  true;

  }

  下面是读取服务器响应的信息,其他的就不一一说了,把outputstream改为inputstream,然后使用inputstream的read方法就可以了。

  ..............

  inputstream

  =

  conServer.openInputStream();

  ..............
您可能感兴趣的:

更多相关内容