教程:在J2ME中基于UDP协议编程

大道至简911

大道至简911

2016-02-19 13:36

下面是个教程:在J2ME中基于UDP协议编程教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!
在GCF中提供了DatagramConnection和Datagram两个接口,借助他们我们可以在J2ME中基于UDP协议开发联网应用程序,在MIDP2.0中,添加了UDPDatagramConnection这个接口。他扩展了DatagramConnection并添加了两个方法getLocalAddress()和getLocalPort()。我们知道UDP服务是不可靠的,假如你希望开发更可靠的联网应用的话可以采用SocketConnection,因为TCP服务是面向连接且可靠的。我们还必须清楚地一点是以上所说的各种连接方式都不是MIDP规范中规定必须实现的。因此在使用之前请参考特定设备的开发文档。MIDP中只有Http连接是必须支持的。
  
  同样,我们要获得DatagramConnection的话,必须通过Connector的open方法,其中的URL应该满足如下的形式。
  
  datagram://localhost:5555 这样的话表示建立了一个客户端模式的连接。在指定ip:localhost和指定端口:5555
  datagram://:5555 这样建立的是一个服务器端模式的连接,在本地的5555端口。
  建立连接后,我们可以通过DatagramConnection的newDatagram()方法构造一个Datagram,然后调用DatagramConnection的send()方法。这样数据报将会发送到指定的接受方。例如你可以构建这个一个负责发送数据的Sender类。
  
  package com.siemens.datagramtest;
  
  import Javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  
  public class Sender extends Thread
  {
  
  private DatagramConnection dc;
  
  private String address;
  
  private String message;
  
  public Sender(DatagramConnection dc)
  {
  this.dc = dc;
  start();
  }
  
  public synchronized void send(String addr, String msg)
  {
  address = addr;
  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)
  {
  }
  }
  
  try
  {
  byte[] bytes = message.getBytes();
  Datagram dg = null;
  // Are we a sender thread for the client ? If so then there's
  // no address parameter
  if (address == null)
  {
  dg = dc.newDatagram(bytes, bytes.length);
  } else
  {
  dg = dc.newDatagram(bytes, bytes.length, address);
  System.out.println(address);
  }
  dc.send(dg);
  } catch (Exception ioe)
  {
  ioe.printStackTrace();
  }
  
  // Completed client handling, return handler to pool and
  // mark for wait
  message = null;
  }
  }
  
  }
  注重联网的时候我们应该在另外一个线程中而不是在主线程中。
  
  服务器端的目的就是启动后监听指定的端口,当客户端连接过来后接受数据并记录下客户端的地址,以便服务器端向客户端发送数据。
  package com.siemens.datagramtest;
  
  import java.io.IOException;
  
  import javax.microedition.io.Connector;
  import javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  import javax.microedition.io.UDPDatagramConnection;
  import javax.microedition.lcdui.Alert;
  import javax.microedition.lcdui.AlertType;
  import javax.microedition.lcdui.Command;
  import javax.microedition.lcdui.CommandListener;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.Form;
  import javax.microedition.lcdui.StringItem;
  import javax.microedition.lcdui.TextField;
  
  public class Server implements Runnable, CommandListener
  {
  
  private DatagramMIDlet parent;
  
  private Display display;
  
  private Form f;
  
  private StringItem si;
  
  private TextField tf;
  
  private Command sendCommand = new Command("Send", Command.ITEM, 1);
  
  Sender sender;
  
  private String address;
  
  public Server(DatagramMIDlet m)
  {
  parent = m;
  display = Display.getDisplay(parent);
  f = new Form("Datagram Server");
  si = new StringItem("Status:", " ");
  tf = new TextField("Send:", "", 30, TextField.ANY);
  f.append(si);
  f.append(tf);
  f.addCommand(sendCommand);
  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");
  DatagramConnection dc =(DatagramConnection)Connector.open("datagram://:5555");
  
  
  sender = new Sender(dc);
  
  while (true)
  {
  Datagram dg = dc.newDatagram(100);
  dc.receive(dg);
  address = dg.getAddress();
  si.setText("Message received - "
    + new String(dg.getData(), 0, dg.getLength()));
  
  }
  
  } catch (IOException ioe)
  {
  Alert a = new Alert("Server", "Port 5000 is already taken.", null,
  AlertType.ERROR);
  a.setTimeout(Alert.FOREVER);
  a.setCommandListener(this);
  display.setCurrent(a);
  } catch (Exception e)
  {
  e.printStackTrace();
  }
  }
  
  public void commandAction(Command c, Displayable s)
  {
  if (c == sendCommand && !parent.isPaused())
  {
  if (address == null)
  {
  si.setText("No destination address");
  } else
  {
  sender.send(address, tf.getString());
  }
  }
  if (c == Alert.DISMISS_COMMAND)
  {
  parent.destroyApp(true);
  parent.notifyDestroyed();
  }
  }
  
  public void stop()
  {
  }
  
  }
  
  客户端代码则是建立连接后向服务器端发送数据,并等待接受服务器返回的数据。
  package com.siemens.datagramtest;
  
  import java.io.IOException;
  
  import javax.microedition.io.ConnectionNotFoundException;
  import javax.microedition.io.Connector;
  import javax.microedition.io.Datagram;
  import javax.microedition.io.DatagramConnection;
  import javax.microedition.lcdui.Alert;
  import javax.microedition.lcdui.AlertType;
  import javax.microedition.lcdui.Command;
  import javax.microedition.lcdui.CommandListener;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.Form;
  import javax.microedition.lcdui.StringItem;
  import javax.microedition.lcdui.TextField;
  
  public class Client implements Runnable, CommandListener
  {
  
  private Da
展开更多 50%)
分享

猜你喜欢

教程:在J2ME中基于UDP协议编程

编程语言 网络编程
教程:在J2ME中基于UDP协议编程

在J2ME中基于MIDP1.0实现组合按键

编程语言 网络编程
在J2ME中基于MIDP1.0实现组合按键

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

J2ME中文教程之J2ME技术概述

编程语言 网络编程
J2ME中文教程之J2ME技术概述

在J2ME程序中实现声音播放

编程语言 网络编程
在J2ME程序中实现声音播放

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

J2ME编程中时间处理全攻略

编程语言 网络编程
J2ME编程中时间处理全攻略

J2ME基础入门教程

编程语言 网络编程
J2ME基础入门教程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS设计圆角自适应按钮教程

CSS设计圆角自适应按钮教程

2.7 ASP中使用Session变量的优缺点

2.7 ASP中使用Session变量的优缺点
下拉加载更多内容 ↓