六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 90|回复: 0

网络编程

[复制链接]

升级  74%

41

主题

41

主题

41

主题

秀才

Rank: 2

积分
161
 楼主| 发表于 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 = 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."登录失败!";}?>
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表