kingpub

          海內(nèi)存知己,博客若比鄰

           

          J2ME中使用Socket開發(fā)聯(lián)網(wǎng)程序

          在J2ME中基于UDP協(xié)議編程一文中介紹了如何使用Datagram和DatagramConnection來開發(fā)應(yīng)用程序,本文將主要講述在MIDP2.0中使用ServerSocketConnection和SocketConnection來開發(fā)聯(lián)網(wǎng)應(yīng)用程序。TCP協(xié)議是可以保證傳輸?shù)馁|(zhì)量的,這也是他和UDP的一大區(qū)別。由于以上談到的四個(gè)類都屬于GCF,他們在程序編寫方面也非常相似,通常我們在Server端的某個(gè)端口監(jiān)聽,當(dāng)客戶端連接服務(wù)器的時(shí)候,則可以得到一個(gè)SocketConnection的實(shí)例。通過兩端的SocketConnection則可以實(shí)現(xiàn)C/S結(jié)構(gòu)的通信了。

            首先看一下,ServerSocketConnection類,它的一個(gè)非常重要的方法就是acceptAndOpen()方法,這個(gè)方法返回一個(gè)SocketConnection實(shí)例,從而使得客戶端和服務(wù)器端可以通過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方法我們可以得到一個(gè)SocketConnection的實(shí)例。

          SocketConnection sc = (SocketConnection)

          Connector.open("socket://host.com:79");

          sc.setSocketOption(SocketConnection.LINGER, 5);

          ?


          InputStream is = sc.openInputStream();

          OutputStream os = sc.openOutputStream();


          os.write("\r\n".getBytes());

          int ch = 0;

          while(ch != -1) {

           ch = is.read();

          }


          is.close();

          os.close();

          sc.close();

            其實(shí)我們在用socket編寫程序的時(shí)候無非遵循這樣的一種規(guī)則:服務(wù)器端建立監(jiān)聽端口等待連接,客戶端通過open()方法與服務(wù)器端建立連接,兩端通過建立的socket傳輸數(shù)據(jù),關(guān)閉連接。

            下圖是我在運(yùn)行WTK中NetworkDemo的時(shí)候的截圖!代碼也一并發(fā)表出來。


          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()) != '\n') && (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()) != '\n') && (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

          */

          public void stop() {

           try {

          stop = true; 

          if (sender != null) {
           sender.stop();
          }

          if (is != null) {
           is.close();
          }

          if (os != null) {
           os.close();
          }

          if (sc != null) {

           sc.close();

          }

           } catch (IOException ioe) {

          }

          }

          }

          package socket;

          import javax.microedition.midlet.*;

          import javax.microedition.io.*;

          import javax.microedition.lcdui.*;

          import java.io.*;

          public class Sender extends Thread {

           private OutputStream os;
           private String message;

           public Sender(OutputStream os) {
          this.os = os;
          start();
           }

           public synchronized void send(String msg) {
          message = msg;
          notify();

           }

           public synchronized void run() {
          while (true) {
           // If no client to deal, wait until one connects
           if (message == null) {
          try {
           wait();
          } catch (InterruptedException e) {

          }
           }

           if (message == null) {
          break;
           }

           try{
          os.write(message.getBytes());
          os.write("\r\n".getBytes());

           } catch (IOException ioe) {
           ioe.printStackTrace();
          }

          // Completed client handling, return handler to pool and
          // mark for wait
          message = null;
           }
          }

          public synchronized void stop() {

           message = null;
           notify();
          }

          }



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=751941

          posted on 2006-06-08 15:24 xiaofeng 閱讀(129) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南川市| 邻水| 余江县| 闸北区| 体育| 莱西市| 彰化市| 兴安盟| 正蓝旗| 婺源县| 平和县| 仪陇县| 化州市| 岳池县| 沁阳市| 绥芬河市| 济南市| 额济纳旗| 全南县| 威宁| 绵阳市| 包头市| 武定县| 清流县| 迁西县| 来宾市| 东光县| 焦作市| 化隆| 海宁市| 通海县| 霍林郭勒市| 固原市| 江都市| 雅安市| 延川县| 景宁| 柯坪县| 武功县| 米林县| 轮台县|