网络编程

本文深入探讨了Socket、UDP与HTTP编程的核心概念、开发流程与实例应用,包括Socket套接字、UDP数据报及HTTP服务器的搭建与交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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."登录失败!";
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值