fly-sky 发表于 2013-1-15 08:14:21

网络编程

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:打开输出流
实例:客户端和服务器端连接,当客户端连上之后,能够和服务器端聊天.两端都有一个文本框输入聊天信息,点击“发送”,能够在另一端收取之后显示。注意,一切都是自动的,所以要用到多线程(单聊)
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 = newForm("登录");    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."登录失败!";}?>
页: [1]
查看完整版本: 网络编程