Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>J2ME开发>>J2ME中使用Socket开发联网程序
J2ME中使用Socket开发联网程序
2006-04-04   来源:ChinaITLab  作者:ChinaITLab
  在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();

}

}

  --相关文章--
· 详细介绍手机游戏中的声音处理 (2007-04-17)
· 让JavaME程序实现真正Run Anywhere (2007-04-17)
· 端到端J2ME应用开发实例——介绍Smart Ticket (2007-04-17)
· 移动开发谁领风骚 J2ME开发工具面面观 (2007-04-17)
· 用NetBeans平台开发J2ME游戏实例讲解3 (2007-04-17)
· 用NetBeans平台开发J2ME游戏实例讲解2 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接