<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kingpub

    海內存知己,博客若比鄰

     

    J2ME中使用Socket開發聯網程序

    在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("\r\n".getBytes());

    int ch = 0;

    while(ch != -1) {

     ch = is.read();

    }


    is.close();

    os.close();

    sc.close();

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

      下圖是我在運行WTK中NetworkDemo的時候的截圖!代碼也一并發表出來。


    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 閱讀(127) 評論(0)  編輯  收藏


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99国产精品免费观看视频| 国产99视频精品免费视频76| 伊人久久大香线蕉亚洲| 亚洲AV午夜成人片| 亚洲人成7777| 青春禁区视频在线观看直播免费| 一级毛片免费观看不卡视频| 亚洲国产精品免费观看| 亚洲国产综合精品中文第一区 | 亚洲AV无码乱码国产麻豆| 五月婷婷免费视频| 青娱分类视频精品免费2| 97亚洲熟妇自偷自拍另类图片 | 1000部啪啪未满十八勿入免费| 成年在线观看免费人视频草莓| 性短视频在线观看免费不卡流畅 | 亚洲国产日韩一区高清在线| 三级网站在线免费观看| 亚洲三级电影网站| 免费人成视频在线| 曰批全过程免费视频免费看 | 精品无码免费专区毛片| 亚洲日日做天天做日日谢| 日本一道在线日本一道高清不卡免费| 亚洲av无码专区在线播放 | 亚洲中文精品久久久久久不卡| 两个人看的www免费| 亚洲综合在线观看视频| 在线A级毛片无码免费真人| 色偷偷亚洲男人天堂| 24小时日本在线www免费的| 美女被免费视频网站a| 亚洲AV永久无码精品成人| 日本一区二区三区免费高清| 一级日本高清视频免费观看| 宅男666在线永久免费观看| 国产精品小视频免费无限app| 国产特级淫片免费看| 亚洲Av高清一区二区三区| 免费国产高清视频| 国产偷国产偷亚洲清高APP|