通过IP校验工具简易理解对象封装及开闭原则的相关思路

paullbm 2013-04-09 05:42:06
假设需要设计一套公用IP工具类,功能上需要实现某个IP是否合法,其通过与可允许访问IP列表(可以是单个、多个、区间)进行比较得到判定结果。另外,对调用者提供IP检查工具(比如判断一个字符串是否是ipv4或ipv6格式)。
设计需要达到以下几点要求:
1).第一版本只需要支持IPv4格式;
2).对于调用者而言进行IP合法性检验时只允许通过工厂类得到实例,以便统一管理;
3).预留扩展功能,使得支持ipv6的时候只增加具体的实现类即可。
4).需要有明确的异常信息。

具体实现如下:
package common.util.ip;

import common.util.ip.exception.IPFormatException;

public interface IPValidator {

/**
* 根据传入的源IP地址和目的IP地址进行匹配检验
* @param {String} srcIP --源IP地址
* @param {String} destIP --目的IP
* @throws IPFormatException
*/
public boolean singleValidate(String srcIP, String destIP) throws IPFormatException;


/**
* 根据传入的源IP地址和目的IP地址进行匹配检验
* @param {String[]} multipleIP --源IP地址组
* @param {String} destIP --目的IP(只能是一个IP)
* @throws IPFormatException
*/
public boolean multipleValidate(String[] multipleIP, String destIP) throws IPFormatException;


/**
* 根据传入的源IP地址和目的IP地址进行匹配检验
* @param {String} regionStartIP --源IP起始地址
* @param {String} regionEndIP --源IP结束地址
* @param {String} destIP --目的IP
* @throws IPFormatException
*/
public boolean regionValidate(String regionStartIP, String regionEndIP, String destIP) throws IPFormatException;

}


package common.util.ip.impl;

import common.util.ip.IPFormatChecker;
import common.util.ip.IPValidator;
import common.util.ip.exception.IPFormatException;

/**
* IPv4校验类
* @author 莫取网名
*/
class IPv4Validator implements IPValidator{

public boolean singleValidate(String srcIP, String destIP) throws IPFormatException{
if(IPFormatChecker.checkIPv4(srcIP) && IPFormatChecker.checkIPv4(destIP)){
return destIP.equals(srcIP);
}
return false;
}


public boolean multipleValidate(String[] multipleIP, String destIP) throws IPFormatException {
if(!IPFormatChecker.checkIPv4(destIP))
return false;

int ipCount=multipleIP.length;
for(int i=0;i<ipCount;i++){
if(IPFormatChecker.checkIPv4(multipleIP[i])){
if(destIP.equals(multipleIP[i])){
return true;
}
}
}
return false;
}


public boolean regionValidate(String regionStartIP, String regionEndIP, String destIP) throws IPFormatException {
if(!IPFormatChecker.checkIPv4(regionStartIP))
return false;

if(!IPFormatChecker.checkIPv4(regionEndIP))
return false;

if(!IPFormatChecker.checkIPv4(destIP))
return false;

//由于.号在正则表达式中是特殊符号,所以split的参数需要进行转义
String[] sSectionStartIPNums = regionStartIP.split("\\."); // 得到源IP段起始地址的4位数字串
String[] sSectionEndIPNums = regionEndIP.split("\\."); // 得到源IP段结束地址的4位数字串
String[] sDestIPNums = destIP.split("\\."); //得到目的IP地址的4位数字串
long ipSectionStart = 0L, ipSectionEnd = 0L, ipDest = 0L;
for (int i = 0; i < 4; i++) {//将三个IP的数字串转换成32位的长整型数据
ipSectionStart = ipSectionStart << 8 | Integer.parseInt(sSectionStartIPNums[i]);
ipSectionEnd = ipSectionEnd << 8 | Integer.parseInt(sSectionEndIPNums[i]);
ipDest = ipDest << 8 | Integer.parseInt(sDestIPNums[i]);
}

//如果起始IP大于结束IP,则进行交换
if (ipSectionStart > ipSectionEnd) {
long temp = ipSectionStart;
ipSectionStart = ipSectionEnd;
ipSectionEnd = temp;
}

return ipSectionStart <= ipDest && ipDest <= ipSectionEnd;
}

}


package common.util.ip.impl;

import common.util.ip.IPValidator;

/**
* IP检验类工厂
* @author 莫取网名
*/
public class IPValidatorFactory {

public static IPValidator getInstance(String className) {
IPValidator ipValidator = null;
try {
// 利用反射获取类型
ipValidator = (IPValidator) Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return ipValidator;
}
}


package common.util.ip.exception;

/**
* IP格式异常类
* @author 莫取网名
*
*/
public class IPFormatException extends Exception {

private static final long serialVersionUID = 2018923238888254267L;

public IPFormatException() {}

public IPFormatException(String message) {
super(message);
}

public IPFormatException(Throwable cause) {
super(cause);
}

public IPFormatException(String message, Throwable cause) {
super(message, cause);
}
}


package common.util.ip;

import common.util.ip.exception.IPFormatException;


/**
* IP格式检查类
* @author 莫取网名
*/
public class IPFormatChecker {

// private final static String IP_V4_REGULAR = "^((25[0-5]|2[0-4]\\d|[0-1]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[0-1]?\\d\\d?)$";
private final static String IP_V4_REGULAR = "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
private final static String IP_V6_REGULAR = ""; //尚未定义(可自行定义)

/**
* 检查某个IPv4的格式是否正确
* @param {String} ip
* @return {boolean}
* @throws IPFormatException
*/
public static boolean checkIPv4(String ip) throws IPFormatException{
if(ip==null || "".equals(ip)){
throw new IPFormatException("IPv4地址不能为空!");
}

if(!ip.matches(IP_V4_REGULAR)){
throw new IPFormatException("IPv4["+ip+"]格式或内容不正确!");
}

return true;
}


/**
* 检查某个IPv6的格式是否正确
* @param {String} ip
* @return {boolean}
* @throws IPFormatException
*/
public static boolean checkIPv6(String ip) throws IPFormatException{
if(ip==null || "".equals(ip)){
throw new IPFormatException("IPv6地址不能为空!");
}

if(!ip.matches(IP_V6_REGULAR)){
throw new IPFormatException("IPv6["+ip+"]格式或内容不正确!");
}

return false;
}
}


package common.test;

import common.util.ip.IPValidator;
import common.util.ip.exception.IPFormatException;
import common.util.ip.impl.IPValidatorFactory;

public class IPTester {

public static void main(String[] args) throws IPFormatException {
String destIP = "192.168.10.1120"; //目标IP
IPValidator ipValidator = (IPValidator) IPValidatorFactory.getInstance("common.util.ip.impl.IPv4Validator");

String singleIP = "192.168.10.116";
System.out.println(ipValidator.singleValidate(singleIP,destIP)); //测试单个IP

String manyIP = "192.168.10.119,192.168.10.116,192.168.10.118";
System.out.println(ipValidator.multipleValidate(manyIP.split(","),destIP)); //测试多个IP

String regionStartIP = "192.168.10.111", regionEndIP = "192.168.11.111";
System.out.println(ipValidator.regionValidate(regionStartIP, regionEndIP, destIP)); //测试区间IP
}
}



代码简易讲解:
1).通过定义接口,规范化开放的方法,尽全面的考虑可能需要的标准性的方法;
2).在工厂类中使用反射机制达到对扩展开放,对修改关闭的效果;
3).将工厂类与实现类放在同一个包中,但限制具体实现类IPv4Validator的包访问控制(class前不加任何修饰),使得工具调用者IPTester无法直接调用具体的实现类进行对象的构造,增加类安全性,及统一规范控制管理。
4).不将IPFormatChecker类中相关的方法放在相关类的原因,是因为这种校验具有通用性,可以对外开放。所以不需要也不必放在IPValidator接口中定义相关的方法以免增加接口的冗余。接口不能强迫子类去实现不是很有必要的方法。
...全文
268 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
一夜笑舟 2013-04-26
  • 打赏
  • 举报
回复
paullbm 2013-04-26
  • 打赏
  • 举报
回复
引用 7 楼 preferme 的回复:
一、本次设计应该是一个工具组件,承担两方面工作,一个是IP地址合法性校验,另一个是IP访问权限校验。 我不明白的访问权限的校验部分,一般来说程序里面都会维护一个IP访问列表的,但是,楼主的程序里面没有这个列表。并且,访问权限不应该通过 判断源地址与目标地址相同 这个条件来判断,你想啊,我要寄信给别人,结果发件人和收件人相同才让发,这样的信,我们能发吗? 二、三种类型的IP数据的校验(单个、多个、区域) 单个IP的校验好理解,多个IP的校验应该就是重复多次的单个IP校验的过程,我不明白的是区域校验。我在学网络的时候,网络区域的概念应该是网段的概念,也就是说,某个区域应该是某个网段,通过掩码辅助表示的那种。最简单的就是A类、B类、C类网段,当然,我们做的肯定是无类区间的那种网段。
1.既然是工具组件,只需要负责数据处理或逻辑加工。而IP访问列表本身属于数据模型,它可以存在于配置文件中,也可以是数据库中,同时也可以来自网络I/O流。所以,在这里不必关心IP访问列表,具体应该交给专门负责读写IP访问列表的Reader或Writer类。判断源地址与目标地址相同,此处的源地址也就是从访问列表中获取的。 2.是有A类、B类、C类网段,但本文提供的代码没有进行细分。 在下写的也是抛砖引玉之用,希望大家多多交流!
冰思雨 2013-04-10
  • 打赏
  • 举报
回复
设计需求有两点不明白的地方: 一、本次设计应该是一个工具组件,承担两方面工作,一个是IP地址合法性校验,另一个是IP访问权限校验。 我不明白的访问权限的校验部分,一般来说程序里面都会维护一个IP访问列表的,但是,楼主的程序里面没有这个列表。并且,访问权限不应该通过 判断源地址与目标地址相同 这个条件来判断,你想啊,我要寄信给别人,结果发件人和收件人相同才让发,这样的信,我们能发吗? 二、三种类型的IP数据的校验(单个、多个、区域) 单个IP的校验好理解,多个IP的校验应该就是重复多次的单个IP校验的过程,我不明白的是区域校验。我在学网络的时候,网络区域的概念应该是网段的概念,也就是说,某个区域应该是某个网段,通过掩码辅助表示的那种。最简单的就是A类、B类、C类网段,当然,我们做的肯定是无类区间的那种网段。 设计上面没有什么不明白的,思路清晰。但是,也存在可优化的部分。比如: 工厂模式里面,由于生产的产品是行为类型(只为方法调用,不为保存数据)的产品,所以,我们可以采用单例工厂,每次获得的都是同一个Action对象(这个对象的调用逻辑里面不存在数据共享和线程安全问题)。 如果想采用多例工厂的设计模式,不妨给每个单例起个名字或者ID,每个ID对应产品的类名称,这样可以反射到对应的实现类,在更换实现类的时候,只需更改对应关系即可。当然了,这样就比较复杂了,还不如与Spring集成。
paullbm 2013-04-10
  • 打赏
  • 举报
回复
引用 5 楼 AFer198215 的回复:
哇~很清晰啊。 兄台有判断一ip是否在 某ip范围段内的方法吗? 思路也行。
代码中也有这部分功能啊。 看来这位兄弟没有看仔细呀!
想喝咖啡的貓 2013-04-10
  • 打赏
  • 举报
回复
哇~很清晰啊。 兄台有判断一ip是否在 某ip范围段内的方法吗? 思路也行。
paullbm 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 peng_hao1988 的回复:
非常不错!通过类的访问权限,规范实现方式,代码的扩展性和维护性很强,程序结构设计非常合理!lz应该有3年以上编程经验,编程思想较成熟,在实践中对程序架构有一定积累。
过奖了:) 4年了,还只是菜鸟一枚。
十年彩虹 2013-04-10
  • 打赏
  • 举报
回复
桃园闲人 2013-04-09
  • 打赏
  • 举报
回复
非常不错!通过类的访问权限,规范实现方式,代码的扩展性和维护性很强,程序结构设计非常合理!lz应该有3年以上编程经验,编程思想较成熟,在实践中对程序架构有一定积累。
paullbm 2013-04-09
  • 打赏
  • 举报
回复
没人看?自己顶!
zxhcloth 2013-04-09
  • 打赏
  • 举报
回复
不错,设计思路清晰!
◆ 01.htm 1、怎么用mscomm控件检测modem是否与计算机联接正确?2、如何用mscomm挂断modem与别的电话机间的连接?(已接通) ◆ 02.htm CWinInetConnection---一个封装了WinInet API函数的类 ◆ 03.htm MODEM通讯意外处理 ◆ 04.htm MsComm 文字传输 ◆ 05.htm PING一个IP地址(向它发送一个数据包并等待回应) ◆ 06.htm SMTP协议简介 (Simple Mail Transfer Protocol) ◆ 07.htm VB5.0 中远程数据库的访问 ◆ 08.htm VB下如何编写CRC校验程序 ◆ 09.htm VB中Winsock控制的UDP协议的使用 ◆ 10.htm Visual Basic 6中发送邮件的新方法 ◆ 11.htm Visual Basic通信程序设计 ◆ 12.htm Whois 示例程序 ◆ 13.htm Winsock Terminal示例程序 ◆ 14.htm WinSock断开导致客户端问题 ◆ 15.htm 把Outlook信箱中的附件另存为 ◆ 16.htm 保证连网计算机时间同步 ◆ 17.htm 编写网络寻呼机 ◆ 18.htm 编制自已的电话录音小程序 ◆ 19.htm 程序中如何启动默认的拨号连接 ◆ 20.htm 程序中如何启动默认的拨号连接? ◆ 21.htm 打开器并进入指定网址 ◆ 22.htm 打开一个直接到自己主页的器 ◆ 23.htm 得到用户的IP地址 ◆ 24.htm 电话拨号 ◆ 25.htm 电子邮件的标准格式 (RFC 822) ◆ 26.htm 断开拨号网络的连接 ◆ 27.htm 断开与 Internet 的连接 ◆ 28.htm 发送电子邮件附件 ◆ 29.htm 发送电子邮件附件1 ◆ 30.htm 发送电子邮件附件2 ◆ 31.htm 发送电子邮件附件3 ◆ 32.htm 发送电子邮件附件4 ◆ 33.htm 获得用户网络登录名 ◆ 34.htm 基 于Win95 的VB5 串 口 通 信 程 序 ◆ 35.htm 基于Win95的VB5串口通信程序 ◆ 36.htm 几个设置IE的API ◆ 37.htm 检测运程数据传送的断线 ◆ 38.htm 简单的聊天程序 ◆ 39.htm 简单电子邮件发送程序 ◆ 40.htm 建立拨号联接 ◆ 41.htm 将所有窗口最小化 ◆ 42.htm 利用IE控件访问Internet ◆ 43.htm 利用IE控件设计简易器 ◆ 44.htm 利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且判断拨号时是否遇忙音 ◆ 45.htm 利用TAPI进行电话拨号 ◆ 46.htm 利用VB访问Internet ◆ 47.htm 利用VB设计聊天室 ◆ 48.htm 利用Visual Basic实现无线通讯 ◆ 49.htm 利用Winsock控件实现局域网通信 ◆ 50.htm 强制一个本地或远程NT系统关闭 ◆ 51.htm 取得网卡序列号 ◆ 52.htm 如何从 Internet 上取回某一个网页的內容? ◆ 53.htm 如何检测是否已连接到Internet? ◆ 54.htm 如何利用Winsock控件编写自己的Internet程序 ◆ 55.htm 如何每天抓取 Internet 上某一个网页中的图片来更换桌面的壁纸? ◆ 56.htm 如何启动拨号网路中的连线? ◆ 57.htm 如何使用MSCOMM32.OCX发送大于80H的字符,可否给个示例程序 ◆ 58.htm 如何通过VB获取网卡地址 ◆ 59.htm 如何用VB打开默认器或默认发信程序? ◆ 60.htm 如何用Visual Basic编写小型的网络系统 ◆ 61.htm 如何在程序中启动 NT 的【拨号连接】对话框 ◆ 62.htm 如何在程序中启动 NT 的【拨号连接】对话框? ◆ 63.htm 如何在网页上使用 VB5 制作的 ActiveX 控件? ◆ 64.htm 如何中断【拨号网络连接】 ◆ 65.htm 设计Browser及FTP程序 ◆ 66.htm 设计Chat程序 ◆ 67.htm 设计E-mail程序 ◆ 68.htm 设置计算机名称 ◆ 69.htm 使用VB获得一页的HTML代码 ◆ 70.htm 使用VB收发电子邮件 ◆ 71.htm 使用标签控件调出器 ◆ 72.htm 使用超链接和发送Email ◆ 73.htm 使用器的文件复制对话框 ◆ 74.htm 输入/输出篇 ◆ 75.htm 通过WnetEnumResource函数获得网络资源 ◆ 76.htm 通往 Internet 的捷径 ◆ 77.htm 显示计算机的名称 ◆ 78.htm 用 MAPI 控件实现发送邮件 ◆ 79.htm 用 WinSock 控件下载文件 ◆ 80.htm 用 Winsock 实现聊天的程序 ◆ 81.htm 用Internet Transfer编写FTP程序 ◆ 82.htm 用Sockets发送电子邮件 ◆ 83.htm 用VB 创 建 自 己 的 通 信 程 序 ◆ 84.htm 用VB5.0开发通信软件的技巧 ◆ 85.htm 用VB5开发IE ◆ 86.htm 用VB编写网络寻呼 ◆ 87.htm 用VB编写小型的网络系统 ◆ 88.htm 用VB创建自己的通信程序 ◆ 89.htm 用VB构建Internet的应用[微软提供] ◆ 90.htm 用VB开发标准CGI程序 ◆ 91.htm 用VB实现客户——服务器(TCP IP)编程实例 ◆ 92.htm 用VB实现客户服务器(TCP、IP)编程实例 ◆ 93.htm 用VB实现聊天讨论室和点对点会话 ◆ 94.htm 用VB写一个定时PING某IP的程序 ◆ 95.htm 用VB制作器 ◆ 96.htm 用Visual Basic 5.0设计E-mail程序(MAPI) ◆ 97.htm 用Visual Basic6.0编写客户服务器程序 ◆ 98.htm 用Visual Basic创建FTP组件 ◆ 99.htm 用Visual Basic开发数据库器 ◆ 100.htm 用Visual Basic轻松地设计Browser及Ftp程序 ◆ 101.htm 用Winsock控件发信Email ◆ 102.htm 用Winsock控件实现文件的下载 ◆ 103.htm 用Winsock实现点对点通信 ◆ 104.htm 邮件检查程序(二) ◆ 105.htm 邮件检查程序(一) ◆ 106.htm 在VB程序中怎样挂断拨号网络 ◆ 107.htm 在VB中操纵OLE服务器应用程序 ◆ 108.htm 在VB中利用UDP协议编写聊天程序 ◆ 109.htm 在VB中模拟实现邮件传输 ◆ 110.htm 在VB中如何得到网络中某一台电脑(电脑名)的网卡地质? (自己的) ◆ 111.htm 在VB中实现文件上传 ◆ 112.htm 在VB中实现文件上载 ◆ 113.htm 在VB中使用UDP协议 ◆ 114.htm 在VB中用Outlook发电子邮件 ◆ 115.htm 在WindowsNT网络中广播消息 ◆ 116.htm 在程序中打开 Internet 拨号连接窗口 ◆ 117.htm 在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intranet虽然可以建立聊天室,但实现点对点实时对话却比较困难。本人用Winsock和VB自制了一套聊天室和对话系统,特拿来供同行们参考。 ◆ 118.htm 在应用中集成器 ◆ 119.htm 在桌面上建立一个 Internet 快捷键 ◆ 120.htm 怎样接收电子邮件(POP3协议简介) ◆ 121.htm 怎样用VB得知系统当前是否处于internet链结状态 ◆ 122.htm 制作自己的网络搜索软件 ◆ 123.htm 自动更新工作站的应用程序 ◆ 124.htm 自己的IE——用VB制作器 ◆ 125.htm HTTP协议(学习笔记) ◆ 126.htm HTTP协议四--关于Chunked编码 ◆ 127.htm IE器完全控制 ◆ 128.htm OICQ服务器系统通讯协议 ◆ 129.htm POP3协议的基本命令 ◆ 130.htm RAS API上的其他Function ◆ 131.htm VB + API 获取 IE 的 “代理服务器” 配制 ◆ 132.htm vb调用winInet API接口post数据到指定的url ◆ 133.htm vb开发通信软件 ◆ 134.htm vb设计数据库电子邮件程序(1) ◆ 135.htm vb设计数据库电子邮件程序(2) ◆ 136.htm vb设计数据库电子邮件程序(3) ◆ 137.htm vb设计数据库电子邮件程序(4) ◆ 138.htm vb设计数据库电子邮件程序(5) ◆ 139.htm vb设计数据库电子邮件程序(6) ◆ 140.htm VB实现应用程序在局域网上自动更新 ◆ 141.htm VB邮件检查程序 ◆ 142.htm vb中从域名得到IP及从IP得到域名 ◆ 143.htm VB中检测是否连网 ◆ 144.htm WebClass实现动态WEB编程之理论篇 ◆ 145.htm Winsocket网络编程谈 ◆ 146.htm Winsock编程框架 ◆ 147.htm Winsock错误代码一览表 ◆ 148.htm 程式自动呼叫拨号网络(RAS API) ◆ 149.htm 打开一个超连接 ◆ 150.htm 得到登入windows 的人的id ◆ 151.htm 访问Internet并调用Explorer ◆ 152.htm 非同步文件下载类 ◆ 153.htm 给Outlook的所有用户发送信件 ◆ 154.htm 获得网卡的MAC地址 ◆ 155.htm 基于WinSock的小型网络管理系统及其实现 ◆ 156.htm 检测是否连接到Internet ◆ 157.htm 检测网络是否连通 ◆ 158.htm 建立Web的超链接树形图 ◆ 159.htm 建立你自己的器-Properties ◆ 160.htm 建立你自己的器-查看源文件 ◆ 161.htm 建立你自己的器-打印 ◆ 162.htm 建立你自己的器-打印设置 ◆ 163.htm 建立你自己的器-发送到FontPage ◆ 164.htm 建立你自己的器-发送到Visual Interdev ◆ 165.htm 建立你自己的器-发送到软盘 ◆ 166.htm 建立你自己的器-复制 ◆ 167.htm 建立你自己的器-另存为 ◆ 168.htm 建立你自己的器-全选 ◆ 169.htm 建立你自己的器-页面设置 ◆ 170.htm 开发通信软件的技术与技巧 ◆ 171.htm 开发网络应用的5个技巧 ◆ 172.htm 利用RAS调用在VB6.0中实现拨号上网 ◆ 173.htm 利用VB提取HTML文件中的EMAIL地址 ◆ 174.htm 枚举出局域网上所有网络资源 ◆ 175.htm 面向Internet的开发工具 ◆ 176.htm 你也可以YAI--VB5中Winsock控件的使用 ◆ 177.htm 判断一个文件是否在IE的缓存中 ◆ 178.htm 启动拨号网络中的连接 ◆ 179.htm 浅谈HTTP协议(二)--返回值 ◆ 180.htm 浅谈HTTP协议(一)--结构 ◆ 181.htm 如何利用 WebBrowser 控件显示 .GIF 动画? ◆ 182.htm 如何映射(中断网络磁盘) ◆ 183.htm 设计E-mail的接收部分 ◆ 184.htm 设置器默认网址 ◆ 185.htm 实现端口对端口的聊天 ◆ 186.htm 使用ASP建立Http组件 ◆ 187.htm 使用VB编写纯ASP程序 ◆ 188.htm 使用vb获取网上邻居里的计算机名 ◆ 189.htm 使用VB建立Web Server ◆ 190.htm 使用Visual Basic开发通讯软件 ◆ 191.htm 使用资源工具包执行本地和远程重新启动 ◆ 192.htm 谈谈远程控制中关于搜索、控制计算机的功能 ◆ 193.htm 压缩 Html ◆ 194.htm 用ASP、VB和XML建立互联网应用程序(1) ◆ 195.htm 用ASP、VB和XML建立互联网应用程序(2) ◆ 196.htm 用ASP、VB和XML建立互联网应用程序(3) ◆ 197.htm 用ASP、VB和XML建立互联网应用程序(4) ◆ 198.htm 用COMMUNICATION控件进行数据采集(学习笔记) ◆ 199.htm 用OLE自动化Outlook ◆ 200.htm ActiveX控件用于DHTML开发 ◆ 201.htm 用VB编写ActiveX DLL实现ASP编程 ◆ 202.htm 用VB编写Windows CGI应用程序 ◆ 203.htm 用VB编写标准CGI程序(上) ◆ 204.htm 用VB编写标准CGI程序(下) ◆ 205.htm 用VB编写收发电子邮件程序 ◆ 206.htm 用VB编写网络监控软件 ◆ 207.htm 用VB编写异步多线程下载程序 ◆ 208.htm 用VB导入导出IE器收藏夹 ◆ 209.htm 用VB定制合路器 ◆ 210.htm 用VB和XML建立集中式应用程序 ◆ 211.htm 用VB将Html转换为文本文件 ◆ 212.htm 用VB开发分布式应用 ◆ 213.htm 用VB设计基于代理服务器的网络计费系统 ◆ 214.htm 用VB制作文件下载程序 ◆ 215.htm 用Visual Basic 实现无线通讯 ◆ 216.htm 用Winsock制作一套聊天室和对话系统 ◆ 217.htm 远程共享显示及声音的实现 ◆ 218.htm 远程启动机器ABC API解决方案 ◆ 219.htm 远程启动机器ABC WMI解决方案 ◆ 220.htm 在VB5中利用Winsock和msDNS控件进行 ◆ 221.htm 找出计算机上当前登录入网的用户 ◆ 222.htm 用VB5 Winsock控件创建TCP(IP)客户机 服务器程序

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧