1、Socket编程
Socket是什么
Socket是套接字,基于TCP协议的传输支持Socket
开发流程:
服务器监听某个端口
客户端连接服务器的某个端口
通过SocketConnection通信
服务器监听某个端口
javax.microedition.io.ServerSocketConnection
javax.microedition.io.Connector专门负责建立各种连接
open(“socket://:端口”),返回ServerSocketConnection
ServerSocketConnection可以获得服务器IP和端口
如果有客户连上来,可以用ServerSocketConnection.acceptAndOpen()返回SocketConnection
客户端连接服务器端
javax.microedition.io.Connector专门负责建立各种连接
open(“socket://IP地址:端口”),返回SocketConnection
SocketConnection重要方法:
getAddress() :得到客户端地址
setSocketOption: 设置一些参数,一般可以用默认
openDataInputStream/ openInputStream:打开输入流
openDataOutputStream/ openOutputStream:打开输出流
实例:客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程(单聊)
实例:聊天室开发
客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程,服务器运行,多个客户端都能够连接到服务器,当连上时,服务器送给客户端一条信息:欢迎您的到来,客户端能给服务器端发信息,信息显示在服务器端,显示为XXX说:????(多聊)
2、UDP编程
UDP是什么
UDP是数据报,只负责传输信息,并不能保证信息一定会被收到,TCP基于连接,UDP基于报文,具体大家可以参考计算机网络
开发流程:
服务器监听某个端口
客户端连接服务器的某个端口
通过Datagram通信
服务器监听某个端口
javax.microedition.io. UDPDatagramConnection
javax.microedition.io.Connector专门负责建立各种连接
open(“datagram://:端口”),返回UDPDatagramConnection
UDPDatagramConnection可以获得服务器IP和端口
客户端连接服务器端
javax.microedition.io.Connector专门负责建立各种连接
open(“datagram://IP地址:端口”),返回UDPDatagramConnection
UDPDatagramConnection重要方法:
newDatagram()
receive()
send()
实例:
客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程
3、HTTP编程
HTTP是一种可以选用的方法
手机--》J2EE--》服务器--》Http响应--》手机
安装HTTP服务器
安装Tomcat: http://www.apache.org
绑定JDK
测试
重要目录:bin; conf;webapps/root;
修改端口
具体可以参见J2EE资料
连接到HTTP服务器
javax.microedition.io.Connector专门负责建立各种连接
open(“http://IP地址:端口”),返回HttpConnection
HttpConnection重要方法:
int getResponseCode()
String getResponseMessage()
String getHost() / int getPort() / String getProtocol() /String getURL()
String getQuery()
String getRequestMethod()
void setRequestMethod(String method)
openDataInputStream, openInputStream
openDataOutputStream, openOutputStream
实例:
界面上有一个账号框,密码框,输入账号密码,由HTTP服务器进行验证,在数据库中查询看是否含有这个用户.
Socket是什么
Socket是套接字,基于TCP协议的传输支持Socket
开发流程:
服务器监听某个端口
客户端连接服务器的某个端口
通过SocketConnection通信
服务器监听某个端口
javax.microedition.io.ServerSocketConnection
javax.microedition.io.Connector专门负责建立各种连接
open(“socket://:端口”),返回ServerSocketConnection
ServerSocketConnection可以获得服务器IP和端口
如果有客户连上来,可以用ServerSocketConnection.acceptAndOpen()返回SocketConnection
客户端连接服务器端
javax.microedition.io.Connector专门负责建立各种连接
open(“socket://IP地址:端口”),返回SocketConnection
SocketConnection重要方法:
getAddress() :得到客户端地址
setSocketOption: 设置一些参数,一般可以用默认
openDataInputStream/ openInputStream:打开输入流
openDataOutputStream/ openOutputStream:打开输出流
实例:客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程(单聊)
package example;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ChatServerMIDlet extends MIDlet implements CommandListener{
private ServerSocketConnection ssc = null;
private SocketConnection sc = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private TextField tfMsg = new TextField("输入聊天信息","",255,TextField.ANY);
private Command cmdSend = new Command("发送",Command.SCREEN,1);
private Form frmChat = new Form("聊天界面");
private Display display;
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
ssc = (ServerSocketConnection)Connector.open("socket://:9999");
sc = (SocketConnection)ssc.acceptAndOpen();
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
new ReceiveThread().start();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void commandAction(Command c,Displayable d){
if(c==cmdSend){
try{
dos.writeUTF(tfMsg.getString());
}catch(Exception ex){}
}
}
class ReceiveThread extends Thread{
public void run(){
while(true){
try{
String msg = dis.readUTF();
frmChat.append(msg + "\n");
}catch(Exception ex){ex.printStackTrace();}
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
}
package example;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import example.ChatServerMIDlet.ReceiveThread;
public class ChatClientMIDlet extends MIDlet implements CommandListener{
private SocketConnection sc = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private TextField tfMsg = new TextField("输入聊天信息","",255,TextField.ANY);
private Command cmdSend = new Command("发送",Command.SCREEN,1);
private Form frmChat = new Form("聊天界面");
private Display display;
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
sc = (SocketConnection)Connector.open("socket://127.0.0.1:9999");
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
new ReceiveThread().start();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void commandAction(Command c,Displayable d){
if(c==cmdSend){
try{
dos.writeUTF(tfMsg.getString());
}catch(Exception ex){}
}
}
class ReceiveThread extends Thread{
public void run(){
while(true){
try{
String msg = dis.readUTF();
frmChat.append(msg + "\n");
}catch(Exception ex){}
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
}
实例:聊天室开发
客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程,服务器运行,多个客户端都能够连接到服务器,当连上时,服务器送给客户端一条信息:欢迎您的到来,客户端能给服务器端发信息,信息显示在服务器端,显示为XXX说:????(多聊)
package example5;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ChatServerMIDlet extends MIDlet implements Runnable{
private ServerSocketConnection ssc = null;
private SocketConnection sc = null;
private Form frm = new Form("聊天纪录");
private Display dis;
private Vector v = new Vector();
protected void startApp() throws MIDletStateChangeException {
dis = Display.getDisplay(this);
dis.setCurrent(frm);
try{
ssc = (ServerSocketConnection)Connector.open("socket://:9999");
new Thread(this).start();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void run(){
while(true){//不断接受客户端连接
try{
sc = (SocketConnection)ssc.acceptAndOpen();
//开一个线程给这个客户端
ChatThread ct = new ChatThread(sc);
v.addElement(ct);//将线程添加进集合
ct.start();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class ChatThread extends Thread{
private SocketConnection sc;
private DataInputStream dis;
private DataOutputStream dos;
private String nickName;
public ChatThread(SocketConnection sc){
this.sc = sc;
this.nickName = nickName;
try{
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
//读取昵称
nickName = dis.readUTF();
frm.append(nickName);
}catch(Exception ex){
ex.printStackTrace();
}
}
public void run(){//负责读取相应SocketConnection的信息
while(true){
try{
String str = dis.readUTF();
//将该信息发送给所有客户端
//访问集合中的所有线程
for(int i=0;i<v.size();i++){
ChatThread ct = (ChatThread)v.elementAt(i);
ct.dos.writeUTF(nickName + "说:" + str);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
}
}
package example5;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ChatClientMIDlet extends MIDlet implements CommandListener{
private SocketConnection sc = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private TextField tfMsg = new TextField("输入聊天信息","",255,TextField.ANY);
private Command cmdSend = new Command("发送",Command.SCREEN,1);
private Form frmChat = new Form("聊天界面");
private Display display;
private TextField tfNickName = new TextField("输入昵称","",10,TextField.ANY);
private Command cmdLogin = new Command("登陆到服务器",Command.SCREEN,1);
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdLogin);
frmChat.append(tfNickName);
frmChat.setCommandListener(this);
}
public void commandAction(Command c,Displayable d){
if(c==cmdSend){
try{
dos.writeUTF(tfMsg.getString());
}catch(Exception ex){}
}
else if(c==cmdLogin){
try{
frmChat.removeCommand(cmdLogin);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);//添加发送聊天信息的文本框
new ChatThread().start();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class ChatThread extends Thread{
public void run(){
try{
sc = (SocketConnection)Connector.open("socket://127.0.0.1:9999");
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
dos.writeUTF(tfNickName.getString());//发送昵称
this.start();
}catch(Exception ex){
ex.printStackTrace();
}
while(true){
try{
String msg = dis.readUTF();
frmChat.append(msg + "\n");
}catch(Exception ex){}
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
}
2、UDP编程
UDP是什么
UDP是数据报,只负责传输信息,并不能保证信息一定会被收到,TCP基于连接,UDP基于报文,具体大家可以参考计算机网络
开发流程:
服务器监听某个端口
客户端连接服务器的某个端口
通过Datagram通信
服务器监听某个端口
javax.microedition.io. UDPDatagramConnection
javax.microedition.io.Connector专门负责建立各种连接
open(“datagram://:端口”),返回UDPDatagramConnection
UDPDatagramConnection可以获得服务器IP和端口
客户端连接服务器端
javax.microedition.io.Connector专门负责建立各种连接
open(“datagram://IP地址:端口”),返回UDPDatagramConnection
UDPDatagramConnection重要方法:
newDatagram()
receive()
send()
实例:
客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程
package example;
import java.util.Vector;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ChatServerMIDlet extends MIDlet implements CommandListener,Runnable{
private TextField tfMsg = new TextField("输入聊天信息","",255,TextField.ANY);
private Command cmdSend = new Command("发送",Command.SCREEN,1);
private Form frmChat = new Form("聊天界面");
private Display display;
private UDPDatagramConnection udc = null;
private final int MAX = 255;
private String address;
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
udc = (UDPDatagramConnection)Connector.open("datagram://:9999");
new Thread(this).start();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void commandAction(Command c,Displayable d){
if(c==cmdSend){//发送
String msg = tfMsg.getString();
try{
Datagram dg = udc.newDatagram(msg.getBytes(), msg.getBytes().length);
dg.setAddress(address);
udc.send(dg);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public void run(){
while(true){
try{
Datagram dg = udc.newDatagram(MAX);
udc.receive(dg);
address = dg.getAddress();
String msg = new String(dg.getData(),0,dg.getLength());
frmChat.append(msg + "\n");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
}
package example;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ChatClientMIDlet extends MIDlet implements CommandListener,Runnable{
private TextField tfMsg = new TextField("输入聊天信息","",255,TextField.ANY);
private Command cmdSend = new Command("发送",Command.SCREEN,1);
private Form frmChat = new Form("聊天界面");
private Display display;
private UDPDatagramConnection udc = null;
private final int MAX = 255;
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
udc = (UDPDatagramConnection)Connector.open("datagram://127.0.0.1:9999");
new Thread(this).start();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void commandAction(Command c,Displayable d){
if(c==cmdSend){//发送
String msg = tfMsg.getString();
try{
Datagram dg = udc.newDatagram(msg.getBytes(), msg.getBytes().length);
udc.send(dg);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public void run(){
while(true){
try{
Datagram dg = udc.newDatagram(MAX);
udc.receive(dg);
String msg = new String(dg.getData(),0,dg.getLength());
frmChat.append(msg + "\n");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
}
3、HTTP编程
HTTP是一种可以选用的方法
手机--》J2EE--》服务器--》Http响应--》手机
安装HTTP服务器
安装Tomcat: http://www.apache.org
绑定JDK
测试
重要目录:bin; conf;webapps/root;
修改端口
具体可以参见J2EE资料
连接到HTTP服务器
javax.microedition.io.Connector专门负责建立各种连接
open(“http://IP地址:端口”),返回HttpConnection
HttpConnection重要方法:
int getResponseCode()
String getResponseMessage()
String getHost() / int getPort() / String getProtocol() /String getURL()
String getQuery()
String getRequestMethod()
void setRequestMethod(String method)
openDataInputStream, openInputStream
openDataOutputStream, openOutputStream
实例:
界面上有一个账号框,密码框,输入账号密码,由HTTP服务器进行验证,在数据库中查询看是否含有这个用户.
package com.cn;
import java.io.DataInputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
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.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class HttpServer extends MIDlet implements CommandListener {
private Display dis;
private Form fr = new Form("登录");
private TextField tname = new TextField("账号:","",255,TextField.ANY);
private TextField tpass = new TextField("密码:", "", 255, TextField.PASSWORD);
private Command cmdSend = new Command("发送", Command.SCREEN, 0);
public HttpServer() {
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
dis = Display.getDisplay(this);
dis.setCurrent(fr);
fr.addCommand(cmdSend);
fr.append(tname);
fr.append(tpass);
fr.setCommandListener(this);
}
public void commandAction(Command c, Displayable d) {
if(c == cmdSend){
new Thread(new Runnable() {
public void run() {
try {
HttpConnection hc = (HttpConnection) Connector.open("http://127.0.0.1/index.php?name="+
tname.getString()+"&pass="+tpass.getString());
DataInputStream din = hc.openDataInputStream();
byte[] b =new byte[(int)hc.getLength()];
din.read(b);
fr.append(new String(b));
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
<?php
$name = $_GET['name'];
$pass = $_GET['pass'];
if($name == "ABC" && $pass ==123) {
echo $name."登录成功!";
}else{
echo $name."登录失败!";
}
?>