J2ME中使用Socket开发联网程序

2016-02-19 13:07 5 1 收藏

今天图老师小编给大家展示的是J2ME中使用Socket开发联网程序,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

在J2ME中基于UDP协议编程一文中介绍了如何使用Datagram和DatagramConnection来开发应用程序,本文将主要讲述在MIDP2.0中使用ServerSocketConnection和SocketConnection来开发联网应用程序。TCP协议是可以保证传输的质量的,这也是他和UDP的一大区别。由于以上谈到的四个类都属于GCF,他们在程序编写方面也非常相似,通常我们在Server端的某个端口监听,当客户端连接服务器的时候,则可以得到一个SocketConnection的实例。通过两端的SocketConnection则可以实现C/S结构的通信了。
  
  首先看一下,ServerSocketConnection类,它的一个非常重要的方法就是acceptAndOpen()方法,这个方法返回一个SocketConnection实例,从而使得客户端和服务器端可以通过socket通信了。典型的代码如下:
  
  // Create the server listening socket for port 1234
  ServerSocketConnection scn = (ServerSocketConnection)
  Connector.open("socket://:1234");
  
  // Wait for a connection.
  SocketConnection sc = (SocketConnection) scn.acceptAndOpen();
  
  // Set application specific hints on the socket.
  sc.setSocketOption(DELAY, 0);
  sc.setSocketOption(LINGER, 0);
  sc.setSocketOption(KEEPALIVE, 0);
  sc.setSocketOption(RCVBUF, 128);
  sc.setSocketOption(SNDBUF, 128);
  
  // Get the input stream of the connection.
  DataInputStream is = sc.openDataInputStream();
  
  // Get the output stream of the connection.
  DataOutputStream os = sc.openDataOutputStream();
  
  // Read the input data.
  String result = is.readUTF();
  
  // Echo the data back to the sender.
  os.writeUTF(result);
  
  // Close everything.
  is.close();
  os.close();
  sc.close();
  scn.close();
  ..
  
  
  SocketConnection的使用也是非常简单,通过Connector的open方法我们可以得到一个SocketConnection的实例。
  SocketConnection sc = (SocketConnection)
  Connector.open("socket://host.com:79");
  sc.setSocketOption(SocketConnection.LINGER, 5);
  
  InputStream is = sc.openInputStream();
  OutputStream os = sc.openOutputStream();
  
  os.write("".getBytes());
  int ch = 0;
  while(ch != -1) {
   ch = is.read();
  }
  
  is.close();
  os.close();
  sc.close();
  其实我们在用socket编写程序的时候无非遵循这样的一种规则:服务器端建立监听端口等待连接,客户端通过open()方法与服务器端建立连接,两端通过建立的socket传输数据,关闭连接。
  下图是我在运行WTK中NetworkDemo的时候的截图!代码也一并发表出来。
  
  J2ME中使用Socket开发联网程序
  

  package socket;
  
  import Javax.microedition.midlet.*;
  import javax.microedition.io.*;
  import javax.microedition.lcdui.*;
  import java.io.*;
  
  public class SocketMIDlet extends MIDlet implements CommandListener {
   private static final String SERVER = "Server";
   private static final String CLIENT = "Client";
   private static final String[] names = { SERVER, CLIENT };
   private static Display display;
   private Form f;
   private ChoiceGroup cg;
   private boolean isPaused;
   private Server server;
   private Client client;
   private Command exitCommand = new Command("Exit", Command.EXIT, 1);
   private Command startCommand = new Command("Start", Command.ITEM, 1);
  
   public SocketMIDlet() {
  display = Display.getDisplay(this);
  f = new Form("Socket Demo");
  cg = new ChoiceGroup("Please select peer", Choice.EXCLUSIVE, names,null);
  f.append(cg);
  
  f.addCommand(exitCommand);
  f.addCommand(startCommand);
  f.setCommandListener(this);
  
  display.setCurrent(f);
   }
  
   public boolean isPaused() {
  return isPaused;
   }
  
   public void startApp() {
  isPaused = false;
   }
  
   public void pauseApp() {
  isPaused = true;
   }
  
   public void destroyApp(boolean unconditional) {
  if (server != null) {
   server.stop();
  }
  if (client != null) {
   client.stop();
  }
   }
  
   public void commandAction(Command c, Displayable s) {
  if (c == exitCommand) {
   destroyApp(true);
   notifyDestroyed();
  } else if (c == startCommand) {
   String name = cg.getString(cg.getSelectedIndex());
   if (name.equals(SERVER)) {
  server = new Server(this);
  server.start();
   } else {
  client = new Client(this);
  client.start();
   }
  }
   }
  
  }
  
  package socket;
  
  import javax.microedition.midlet.*;
  import javax.microedition.io.*;
  import javax.microedition.lcdui.*;
  import java.io.*;
  
  public class Server implements Runnable, CommandListener {
   private SocketMIDlet parent;
   private Display display;
   private Form f;
   private StringItem si;
   private TextField tf;
   private boolean stop;
   private Command sendCommand = new Command("Send", Command.ITEM, 1);
   private Command exitCommand = new Command("Exit", Command.EXIT, 1);
   InputStream is;
   OutputStream os;
   SocketConnection sc;
   ServerSocketConnection scn;
   Sender sender;
   
   public Server(SocketMIDlet m) {
  parent = m;
  display = Display.getDisplay(parent);
  f = new Form("Socket Server");
  si = new StringItem("Status:", " ");
  tf = new TextField("Send:", "", 30, TextField.ANY);
  f.append(si);
  f.append(tf);
  f.addCommand(exitCommand);
  f.setCommandListener(this);
  display.setCurrent(f);
   }
  
   public void start() {
  Thread t = new Thread(this);
  t.start();
   }
  
   public void run() {
  try {
   si.setText("Waiting for connection");
   scn = (ServerSocketConnection) Connector.open("socket://:5009");
  
   // Wait for a connection.
   sc = (SocketConnection) scn.acceptAndOpen();
   si.setText("Connection accepted");
   is = sc.openInputStream();
   os = sc.openOutputStream();
   sender = new Sender(os);
   
   // Allow sending of messages only after Sender is created
   f.addCommand(sendCommand);
  
   while (true) {
  StringBuffer sb = new StringBuffer();
  int c = 0;
  
  while (((c = is.read()) != '') && (c != -1)) {
   sb.append((char) c);
  }
  
  if (c == -1) {
   break;
  }
  si.setText("Message received - " + sb.toString());
   }
   stop();
   si.setText("Connection is closed");
   f.removeCommand(sendCommand);
  } catch (IOException ioe) {
   if (ioe.getMessage().equals("ServerSocket Open")) {
  Alert a = new Alert("Server", "Port 5000 is already taken.",null, AlertType.ERROR);
  a.setTimeout(Alert.FOREVER);
  a.setCommandListener(this);
  display.setCurrent(a);
   } else {
  if (!stop) {
   ioe.printStackTrace();
  }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
   }
  
   public void commandAction(Command c, Displayable s) {
  if (c == sendCommand && !parent.isPaused()) {
   sender.send(tf.getString());
  }
  
  if ((c == Alert.DISMISS_COMMAND) (c == exitCommand)) {
   parent.notifyDestroyed();
   parent.destroyApp(true);
  }
   }
  
  /**
  * Close all open streams
  */
  
   public void stop() {
  try {
   stop = true;
  
   if (is != null) {
  is.close();
   }
  
   if (os != null) {
  os.close();
   }
  
   if (sc != null) {
  sc.close();
   }
  
   if (scn != null) {
  scn.close();
   }
  } catch (IOException ioe) {
   }
  }
  }
  
  package socket;
  
  import javax.microedition.midlet.*;
  import javax.microedition.io.*;
  import javax.microedition.lcdui.*;
  import java.io.*;
  
  public class Client implements Runnable, CommandListener {
   private SocketMIDlet parent;
   private Display display;
   private Form f;
   private StringItem si;
   private TextField tf;
   private boolean stop;
   private Command sendCommand = new Command("Send", Command.ITEM, 1);
   private Command exitCommand = new Command("Exit", Command.EXIT, 1);
  
   InputStream is;
   OutputStream os;
   SocketConnection sc;
   Sender sender;
  
   public Client(SocketMIDlet m) {
  parent = m;
  display = Display.getDisplay(parent);
  f = new Form("Socket Client");
  si = new StringItem("Status:", " ");
  tf = new TextField("Send:", "", 30, TextField.ANY);
  f.append(si);
  f.append(tf);
  f.addCommand(exitCommand);
  f.addCommand(sendCommand);
  f.setCommandListener(this);
  display.setCurrent(f);
   }
  
   /**
   * Start the client thread
   */
   public void start() {
  Thread t = new Thread(this);
  t.start();
   }
  
   public void run() {
  try {
   sc = (SocketConnection) Connector.open("socket://localhost:5009");
   si.setText("Connected to server");
   is = sc.openInputStream();
   os = sc.openOutputStream();
  
   // Start the thread for sending messages - see Sender's main
   // comment for eXPlanation
   sender = new Sender(os);
   
   // Loop forever, receiving data
   while (true) {
  StringBuffer sb = new StringBuffer();
  int c = 0;
  while (((c = is.read()) != '') && (c != -1)) {
   sb.append((char) c);
  }
  
  if (c == -1) {
   break;
  }
  // Display message to user
  si.setText("Message received - " + sb.toString());
   }
   stop();
   si.setText("Connection closed");
   f.removeCommand(sendCommand);
  } catch (ConnectionNotFoundException cnfe) {
   Alert a = new Alert("Client", "Please run Server MIDlet first",null, AlertType.ERROR);
   a.setTimeout(Alert.FOREVER);
   a.setCommandListener(this);
   display.setCurrent(a);
  } catch (IOException ioe) {
   if (!stop) {
  ioe.printStackTrace();
   }
  } catch (Exception e) {
  e.printStackTrace();
   }
  }
  
  public void commandAction(Command c, Displayable s) {
   if (c == sendCommand && !parent.isPaused()) {
  sender.send(tf.getString());
   }
  
   if ((c == Alert.DISMISS_COMMAND) (c == exitCommand)) {
  parent.notifyDestroyed();
  parent.destroyApp(true);
   }
  }
  
  /**
  * Close all open streams
  */
  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

来源:http://www.tulaoshi.com/n/20160219/1602998.html

延伸阅读
我们将从定义 J2ME 开始,从最简单的J2ME 是什么开始讲起。然后讨论它的总体架构并学习 J2ME 目标设备。作为架构讨论的一部分,我们将提供有关简表和配置的概述。同时我们会简要介绍打包和配置 J2ME 应用程序过程中的一些注重事项。 J2ME 是什么? Sun Microsystems 将 J2ME 定义为“一种以广泛的消费性产品为目标的的高度...
一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明: J2ME中使用到的Java基础知识: 1、Java语法基础:包括基本数...
J2ME(Java 2 Micro Edition)的出现把Java开发者彻底地引入了开发无线设备应用程序的广阔天地。当然,移动设备因其功能和处理能力而多种多样,但是,J2ME通过定义configurations和profiles而对这些差异性进行了逻辑抽象,然后整合两种设置为在特定移动设备上开发应用程序提供了一套完整的平台和API。 连接限制设备配置CLDC(Con...
一.代码优化 内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎...
一、序言 昨天在网上闲逛,发现一篇讲解用Delphi实现华容道游戏的文章,颇受启发.于是,产生了将华容道游戏移植到手机中去的冲动.现在手机游戏琳琅满目,不一而足,华容道的实现版本也很多.正巧不久前笔者对J2ME下了一番功夫,正想借这个机会小试牛刀。选用J2ME的原因还有一个就是目前Java开发大行其到,无线增殖业务迅猛发...

经验教程

425

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部