您的位置:首页 > 编程语言

郭克华手机编程教学视频----我的练习源码(29)UDP编程

2009-03-18 11:40 721 查看
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lession20;

import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.UDPDatagramConnection;
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.TextField;
import javax.microedition.midlet.*;

/**
* UDP编程
* UDP没有TCP可靠,但性能较高
* TCP是基于连接的(Connection),而UDP是基于数据报的(Datagram)
* 主要用到的接口:UDPDatagramConnection
* 可以通过Connector来获得它
*
* 服务器编程步骤:
* 1.监听端口
* 2.通过DataGram通信
*
* 案例:建立一个服务器与客户端对聊的程序
* 提供一个文本框和一个发送按钮,可以互发信息
* @author mouyong
*/
public class UDPServerMidlet extends MIDlet {

Form frmMain = new Form("聊天!");
Display dis = Display.getDisplay(this);
TextField txtMsg = new TextField("聊天", "", 100, TextField.ANY);
Command cmdSend = new Command("发送", Command.SCREEN, 1);
UDPDatagramConnection udc = null;
//保存客户端地址
String address = null;

public void startApp() {
//simple1();
simple2();

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

//基本功能测试:监听与接收
private void simple1() {
try {
//监听端口
//UDP不需要一个方法来死等连接,只要open就可以了。
//也就是说UDP的服务器端与客户端的地位是相同的。
UDPDatagramConnection udc = (UDPDatagramConnection) Connector.open("datagram://:9999");
//创建一个用于接收数据的Datagram,比较麻烦的一件事就是Datagram的大小不好确定
Datagram dgram = udc.newDatagram(10);
//接收
udc.receive(dgram);
//获得数据
byte[] str = dgram.getData();
//显示
System.out.println("文字:" + new String(str));
} catch (IOException ex) {
ex.printStackTrace();
}
}
//案例:聊天

private void simple2() {
dis.setCurrent(frmMain);
frmMain.addCommand(cmdSend);
frmMain.append(txtMsg);
try {
udc = (UDPDatagramConnection) Connector.open("datagram://:9999");
Datagram dtAddress = udc.newDatagram(10);
//获得客户端地址
udc.receive(dtAddress);
address = dtAddress.getAddress();
System.out.println("客户端地址:" + address);

//启动线程,监听接收
new ReceiveThread().start();
} catch (IOException ex) {
ex.printStackTrace();
}

//监听
frmMain.setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
if (c == cmdSend) {
String strSend = txtMsg.getString();
try {
Datagram dtSend = udc.newDatagram(strSend.getBytes(), strSend.getBytes().length, address);
udc.send(dtSend);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}

//用于接收的线程
private class ReceiveThread extends Thread {

public void run() {
while (true) {
try {
Datagram dtReceive = udc.newDatagram(100);
udc.receive(dtReceive);
String strReceive = new String(dtReceive.getData(), 0, dtReceive.getLength());
frmMain.append(strReceive);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lession20;

import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.UDPDatagramConnection;
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.TextField;
import javax.microedition.midlet.*;

/**
* 客户端编程步骤:
* 1.连接服务器的某个端口
* 2.通过DataGram通信
* @author mouyong
*/
public class UDPClientMidlet extends MIDlet {

Form frmMain = new Form("聊天!");
Display dis = Display.getDisplay(this);
TextField txtMsg = new TextField("聊天", "", 100, TextField.ANY);
Command cmdSend = new Command("发送", Command.SCREEN, 1);
UDPDatagramConnection udc = null;

public void startApp() {
//simple1();
simple2();
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
//基本功能测试:发送信息到服务器端

public void simple1() {
try {
udc = (UDPDatagramConnection) Connector.open("datagram://127.0.0.1:9999");
//创建一个准备发送的数据报
Datagram dg = udc.newDatagram("中国人".getBytes(), "中国人".getBytes().length);
//发送
udc.send(dg);

} catch (IOException ex) {
ex.printStackTrace();
}
}
//案例:聊天

public void simple2() {
dis.setCurrent(frmMain);
frmMain.addCommand(cmdSend);
frmMain.append(txtMsg);
try {
udc = (UDPDatagramConnection) Connector.open("datagram://127.0.0.1:9999");
Datagram dtAddress = udc.newDatagram(10);
//连上服务器端后,就先发送地址给服务器
udc.send(dtAddress);

//启动线程,监听接收
new ReceiveThread().start();
} catch (IOException ex) {
ex.printStackTrace();
}

//监听
frmMain.setCommandListener(new CommandListener() {

public void commandAction(Command c, Displayable d) {
if (c == cmdSend) {
String strSend = txtMsg.getString();
try {
Datagram dtSend = udc.newDatagram(strSend.getBytes(), strSend.getBytes().length);
udc.send(dtSend);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}

//用于接收的线程
private class ReceiveThread extends Thread {

public void run() {
while (true) {
try {
Datagram dtReceive = udc.newDatagram(100);
udc.receive(dtReceive);
String strReceive = new String(dtReceive.getData(), 0, dtReceive.getLength());
frmMain.append(strReceive);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐