开发J2ME低级联网应用

开发J2ME低级联网应用
By  Michael1116 发表于 2006-7-6 14:34:00 

作者:mingjava   文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=46

开发J2ME联网应用程序中介绍了如何通过Http协议进行联网,通常我们把通过Http联网叫做高级联网,在这片文章中我们讲述如何使用Socket在TCP/IP层进行联网操作。如果你还不清楚J2ME平台的通用联网框架,那么请参考介绍J2ME通用联网框架

    在MIDP2.0中提供了如下重要的类对TCP/IP和UDP进行支持。
javax.microedition.io.SocketConnection
javax.microedition.io.ServerSocketConnection
javax.microedition.io.UDPDatagramConnection
今天主要讲述在客户端使用SocketConnection和TCP/IP服务器进行通信,后面的两个类将在后续的文章中介绍,SocketConnection定义了socket流连接。调用Connector.open("socket://host:port")会返回一个SocketConnection的实例。通过调用socket.openInputStream()和socket.openOutputStream()两个方法我们将得到InputStream和OutputStream的实例,这样我们就可以和服务器进行通信了,如下所示:
SocketConnection client = (SocketConnection) Connector.open("socket://" + hostname + ":" + port);
client.setSocketOption(DELAY, 0);
client.setSocketOption(KEEPALIVE, 0);
InputStream is = client.openInputStream();
OutputStream os = client.openOutputStream();
os.write("some string".getBytes());
int c = 0;
while((c = is.read()) != -1) {
   // do something with the response
}
is.close();
os.close();
client.close();

    注意在联网的时候我们还是必须要在另一个线程内进行联网操作,而不能再主线程进行。这样的目的是为了避免用户界面的堵塞。通常我们可以定义一个类扩展Thread类并提供一个把MIDlet作为参数的构造器,为了提高效率我们通过使用wait()和notify()方法,这样只有在用户按下按钮的时候,线程才被唤醒去执行联网操作,否则再启动后他一直出去"wait"的状态。
class CommandThread extends Thread {
    MIDlet parent;

    StreamConnection socket = null;
    InputStream is = null;

    boolean exit = false;

    public CommandThread(MIDlet parent) {
      this.parent = parent;
    }

      public void run() {
        while (!exit) {
          synchronized(parent) {
            while(!commandAvailable) {
              try {
                parent.wait();
              }
              catch (InterruptedException e) {
              }
            }
          }

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

    TCP/IP服务器的写法和一般的服务器写法是一样的,因此不再多介绍。如果有问题可以参考java.net包的内容。下面通过例子演示一下,我们构建一个时间服务器,在手机端来通过socket访问并得到当前时间显示在屏幕上。代码如下:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.Date;

public class DayTimeServer {

  public static void main(String args[]) {

    int dayTimePort = 13;

    if (args.length == 1) {
      try {
        dayTimePort = Integer.parseInt(args[0]);
      }
      catch (NumberFormatException e) {
        System.out.println("invalid port number");
        System.exit(0);
      }
    }

    ServerSocket serverSocket = null;
    Socket sock;

    DataOutputStream dataout;   

    try {
      serverSocket = new ServerSocket(dayTimePort);
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
      System.exit(0);
    }

    while (true) {
      try {
        sock = serverSocket.accept();
        dataout = new DataOutputStream(new BufferedOutputStream
          (sock.getOutputStream()));
        String dateString = new Date().toString();
        dataout.write(dateString.getBytes(),0,dateString.length());
        dataout.flush();
        sock.close();
        }
      catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
      }
    }
  }
}

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import java.io.*;
import javax.microedition.io.*;

public class DayTimeClient extends javax.microedition.midlet.MIDlet
    implements CommandListener {

  Display display;

  private boolean commandAvailable;
  CommandThread commandThread;
 
  List menu;
  Form outputForm;
  StringItem dt;
     
  Command cmdBack;
  Command cmdExit;

  private static final String PROTOCOL = "socket:";
 
  private String dayTimeURL;

  public void startApp() {
    String host = getAppProperty("HOST");
    String port = getAppProperty("DAYTIME_PORT");
    try {
      (Integer.parseInt(port));
    }
    catch (NumberFormatException e) {
      destroyApp(false);
      notifyDestroyed();
    }
   
    dayTimeURL = PROTOCOL + "//" + host + ":" + port;
    display = Display.getDisplay(this);
    outputForm = new Form("Date/Time");
    dt = new StringItem(null,null);
    outputForm.append(dt);
    cmdBack = new Command("Back",Command.BACK,1);
    outputForm.addCommand(cmdBack);
    cmdExit = new Command("Exit",Command.EXIT,1);
    outputForm.addCommand(cmdExit);
    outputForm.setCommandListener(this);

    menu = new List("Menu",List.IMPLICIT);
    menu.append("Get Date/Time",null);
    menu.append("Exit",null);
    menu.setCommandListener(this);
    display.setCurrent(menu);

    commandAvailable = false;
    commandThread = new CommandThread(this);
    commandThread.start();
  }


  public void pauseApp() {
  }

  public void destroyApp(boolean unconditional) {
  }

  public void commandAction(Command cmd, Displayable d) {
    if (cmd == cmdExit) {
      destroyApp(false);
      notifyDestroyed();
    }
    else if (cmd == cmdBack) {
      display.setCurrent(menu);
    }
    else if ((d == menu) && (cmd == List.SELECT_COMMAND)) {
      synchronized (this) {
        commandAvailable = true;
        notify();
      }
    }
  }   

  class CommandThread extends Thread {
    MIDlet parent;

    StreamConnection socket = null;
    InputStream is = null;

    boolean exit = false;

    public CommandThread(MIDlet parent) {
      this.parent = parent;
    }

      public void run() {
        while (!exit) {
          synchronized(parent) {
            while(!commandAvailable) {
              try {
                parent.wait();
              }
              catch (InterruptedException e) {
              }
            }
          }
          commandAvailable = false;
     
          switch (menu.getSelectedIndex()) {
            case 0:
              getDate();
              break;
            case 1:
              exit = true;
          }
        }
        destroyApp(false);
        notifyDestroyed();
      }

    public void getDate() {
      try {
        socket =
          (StreamConnection)Connector.open(dayTimeURL,
             Connector.READ, true);

        is = socket.openInputStream();
      }
      catch (Exception e) {
      }

      try {
        int b;
        StringBuffer sb = new StringBuffer();
        while ( (b = is.read()) != -1) {
          sb.append((char)b);
        }
        socket.close();
        dt.setText(sb.toString());
        display.setCurrent(outputForm);
      }
      catch (Exception e) {
      }
    }
  }
}

你需要在jad文件中定义两个属性值,当然你也可以直接写在源代码中
DAYTIME_PORT: 13
HOST: 127.0.0.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值