1、首先在电脑上搜>这本书,这就是基础,一定要多看,多练,多写,多看,做到想写什么简单程序都可以信手拈来,那基础部分就算过关了。
2、有些人喜欢玩游戏,正好有个游戏类的,可以边玩边编程,那就是robocode,用JAVA编程技术来玩游戏吧。
Robocode就是这样一个东西,但是更好一些。它是一个基于Java语言的机器人作战游戏。其代码的编写和建模都不错,玩起来也很有趣。Robocode是很多"编程游戏"软件中的一个,他们共同的特征是在没有用户输入的状态下许多机器人在一个及竞技场中比赛,用户必须编制一个高效的机器人来取胜。Robocode特别的像一场机器人坦克的大混战,它们互相开火直到只剩一个胜利者。程序完全是由JAVA编写,并且玩家必须要创造一个继承自Robot类的类。可以在游戏中学会编程。
3、Java是目前使用最为广泛的网络编程语言之一。有些人喜欢在书中学java,那就可以看>,java会分方向,j2me(手机编程)不建议你去学这个(要学就学android手机编程),j2ee方向(Web编程),先学html,javaScript,css,然后就学servlet和jsp,《jsp应用开发详解》(入门)《Servlet与JSP核心编程》(核心)这两本书还不错,然后就可以学SSH(三大框架,这个书一大堆)。
4、除此之外,大家还可以在网上看一些视频教程,增加自己不足的地方,毕竟总是一个人学习会有很多缺陷,还可以组队一起学习。
java的大方向就是j2ee
j2ee不仅仅是socket编程,具体包括13中核心技术。
J2EE的核心API与组件
J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述):
1 JDBC(Java Database Connectivity):
JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性。
2 JNDI(Java Name and Directory Interface):
JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和 *** 作企业级的资源如DNS和LDAP,本地文件系统,或应用服务器中的对象。
3 EJB(Enterprise JavaBean):
J2EE技术之所以赢得媒体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑,由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性,使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。
4 RMI(Remote Method Invoke):
正如其名字所表示的那样,RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。
5 Java IDL/CORBA:
在Java IDL的支持下,开发人员可以将Java和CORBA集成在一起。他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和旧的系统相集成。
6 JSP(Java Server Pages):
JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。
7 Java Servlet:
Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,当被请求时开始执行,这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。
8 XML(Extensible Markup Language):
XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。
XML的发展和Java是相互独立的,但是,它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合,您可以得到一个完美的具有平台独立性的解决方案。
9 JMS(Java Message Service):
MS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域,有支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另
一种方式来对您的应用与旧的后台系统相集成。
10 JTA(Java Transaction Architecture):
JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。
11 JTS(Java Transaction Service):
JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范,并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。
12 JavaMail:
JavaMail是用于存取邮件服务器的API,它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器。
13 JAF(JavaBeans Activation Framework):
JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者转换自Java对象。大多数应用都可以不需要直接使用JAF。
第一个阶段(java基础阶段)
1java语法
2面向对象
3常用的api
4界面编程
5多线程
6文件io
7java网络编程
看看 张孝祥老师的 java视频 (不过张孝
祥老师普通话不是很好,而且语速很慢,不过技术是不用说的啦!感谢张老师的无私奉献了,呵呵)
第二个阶段 (数据库阶段)
1oracle
2mysql
3sql server
目前中国软件公司用的最多的三大主流数据库是sql server,mysql ,oracle 目前看来oracle数据库越来越流行了。一般情况下PHP对应MySQL数据库;ASP对应SQL数据库;JSP对应ORACLE数据库。所以大家会经常看
到市场上JAVA培训都是用的ORACLE数据库,其实你学会了ORACLE数据库,再去学习MySQL、SQL数 据库,你会觉得有很多相似的之处,学起来也容易上手了。oracle我推荐
韩顺平老师 oracle视频 (韩老师授课很有趣,特适合基础不太好的人。讲课有一套)
第三个阶段 (web开发阶段)
1html
2css
3javascript
这三个部分是进行web开发的必须技术一定要好好学习不过我当时没有发现有讲的特别好的。好像很多老师都讲框架和后台,界面这块不多,所以就没有什么好推荐的了,大家可以
在网上找找看看,<<别具光芒>> 这本书讲的挺好,不过不太适合初学者,可以看看孙鑫老师视频的《HTML语言速成》。
第四个阶段 (j2ee 中级部分)
1servlet
2jsp
3mvc
这个阶段是接近企业的需求了,所以学习起来,难度偏大,如果前面没有学习扎实,会比较麻烦,我就是这样的,前面没有吃透,就学习j2ee 中级,搞得我消化不良。所以小弟我中心的告诫大家,把前面的学好,再学习第四个阶段,这里的mvc思想不太好理解,是学习的重点。同时要学习tomcat/jboss/wl 这些服务器所以,你可能感到要学习的东西一下多了很多,其实我就在这里动摇过,有那么一段时间,又想放弃了。可是一想到 房东那种不屑的表情,我就想,一定要好好学习,混出个人样来。我家是农村的,回去就是种地,当公务员我没有关系,再说会老家我学习的专业也用不上,要不就是当个网管什么的,不说了,反正当时心情很复杂吧。这个阶段我推荐
韩顺平老师 servlet视频 jsp视频 (这里也特别谢谢韩顺平老师,我是比较喜欢他讲课的风格,因为我当时基础不好,所以不敢看讲的太理论的课。)
第五个阶段 (j2ee 高级部分)
1struts
2hibernate
3spring
学习完Servlet、JSP然后再去学习框架Struts、Hibernate、Spring等最前沿的最流行的网络编程必备的软件技能。
推荐的参考书籍是美河图书提供《Servlet与JSP核心编程》
框架的基础就是Servlet、JSP。首先大家应该学习的是Struts框架,典型的MVC模型。推荐学习视频是 张小静的Struts视频。(网上有孙鑫的视频嘛,主要就是讲的Struts、Hibernate、Spring这三个框架,但是这个好像是偷录的效果不好,听起来比较吃力,衔接的不好)
推荐书籍孙卫琴编著《精通Struts基于MVC的JavaWeb设计与开发》
然后就是Hibernate框架,推荐李兴华老师的Hibernate视频,
参考书籍孙卫琴 《精通Java对象持久化技术详解》
最后关于Spring框架的视频,在网上你可以搜索到很多,但是系统讲解的真的没有发现,本着对大家负责的态度,不敢乱推荐,大家到网上搜一下,也许现在有了也可能。
学完上述三个阶段的内容,就在看看xml,ajax,ejb这些知识!尤其是的Ajax用得非常火,我们公司就用,ajax的框架流行的是(jquery,dw),我们公司用的是jquery这里提一 下,学习Ajax之前一定要有JavaScript的基础,推荐视频张孝祥JavaScript网页开发,这套视频有相应 的配套书籍《JavaScript网页开发》
按照你的要求编写的程序如下:
public class MyClass {
int m_iInt;
MyClass(int i){
m_iInt=i;
}
void setValue(int i){
m_iInt=i;
}
int getValue(){
return m_iInt;
}
void printValue(){
Systemoutprintln("m_iInt="+m_iInt);
}
public static void main(String[] args) {
MyClass m=new MyClass(33);
mprintValue();
msetValue(56);
Systemoutprintln(mgetValue());
}
}
IPv 背景介绍
目前我们使用的是第二代互联网 IPv 技术 它的最大问题是网络地址资源有限 从理论上讲 可以编址 万个网络 亿台主机 但采用 A B C 三类编址方式后 可用的网络地址和主机地址的数目大打折扣 以至目前的 IP 地址近乎枯竭 网络地址不足 严重地制约了全球互联网的应用和发展
一方面是地址资源数量的限制 另一方面是随着电子技术及网络技术的发展 计算机网络将进入人们的日常生活 可能身边的每一样东西都需要连入全球因特网 在这种网络空间匮乏的环境下 IPv 应运而生 它的产生不但解决了网络地址资源数量的问题 同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍
如果说 IPv 实现的只是人机对话 那么 IPv 则扩展到任意事物之间的对话 它不仅可以为人类服务 还将服务于众多硬件设备 如家用电器 传感器 远程照相机 汽车等 它将是无时不在 无处不在的深入社会每个角落的真正的宽带网 它所带来的经济效益也将非常巨大
当然 IPv 并非十全十美 一劳永逸 不可能解决所有问题 IPv 只能在发展中不断完善 也不可能在一夜之间发生 过渡需要时间和成本 但从长远看 IPv 有利于互联网的持续和长久发展 目前 国际互联网组织已经决定成立两个专门工作组 制定相应的国际标准
Java 对 IPv 的支持
随着 IPv 越来越受到业界的重视 Java 从 版开始支持 Linux 和 Solaris 平台上的 IPv 版起又加入了 Windows 平台上的支持 相对于 C++ Java 很好得封装了 IPv 和 IPv 的变化部分 遗留代码都可以原生支持 IPv 而不用随底层具体实现的变化而变化
那么 Java 是如何来支持 IPv 的呢 Java 网络栈会优先检查底层系统是否支持 IPv 以及采用的何种 IP 栈系统 如果是双栈系统 那它直接创建一个 IPv 套接字(如图 )
图 双栈结构
对于分隔栈系统 Java 则创建 IPv /v 两个套接字(如图 ) 如果是 TCP 客户端程序 一旦其中某个套接字连接成功 另一个套接字就会被关闭 这个套接字连接使用的 IP 协议类型也就此被固定下来 如果是 TCP 服务器端程序 因为无法预期客户端使用的 IP 协议 所以 IPv /v 两个套接字会被一直保留 对于 UDP 应用程序 无论是客户端还是服务器端程序 两个套接字都会保留来完成通信
图 分隔栈结构
如何验证 IPv 地址
IPv 地址表示
从 IPv 到 IPv 最显著的变化就是网络地址的长度 IPv 地址为 位长度 一般采用 个十六进制数 但通常写做 组每组 个十六进制的形式 例如
: db : a : d : : a e: : 是一个合法的 IPv 地址 如果四个数字都是零 则可以被省略
: db : a : : : a e: : 等同于 : db : a :: : a e: :
遵从这些规则 如果因为省略而出现了两个以上的冒号的话 可以压缩为一个 但这种零压缩在地址中只能出现一次 因此
: DB : : : : : : ab
: DB : : : :: : ab
: DB : : : : : : ab
: DB : :: : : ab
: DB :: : ab
都是合法的地址 并且他们是等价的 但 :: de::cade 是非法的 (因为这样会使得搞不清楚每个压缩中有几个全零的分组) 同时前导的零可以省略 因此 : DB : de:: e 等于 :DB : de::e
IPv 地址校验
IPv 地址可以很容易的转化为 IPv 格式 举例来说 如果 IPv 的一个地址为 (十六进制为 x B B ) 它可以被转化为 : : : : : : B: B 或者 : B: B 同时 还可以使用混合符号(IPv patible address) 则地址可以为 :
在 IPv 的环境下开发 Java 应用 或者移植已有的 IPv 环境下开发的 Java 应用到 IPv 环境中来 对于 IPv 网络地址的验证是必须的步骤 尤其是对那些提供了 UI(用户接口)的 Java 应用
所幸的是 从 Java 开始 Sun 就增加了对 IPv 网络地址校验的 Java 支持 程序员可以通过简单地调用方法 util IPAddressUtil isIPv LiteralAddress() 来验证一个 String 类型的输入是否是一个合法的 IPv 网络地址
为了更深入一步地了解 IPv 的网络地址规范 及其验证算法 笔者参阅了一些材料 包括上文所述的方法 util IPAddressUtil isIPv LiteralAddress() 的源代码 以及目前网络上流传的一些 IPv 网络地址的正则表达式 发现
由于 IPv 协议所允许的网络地址格式较多 规范较宽松(例如零压缩地址 IPv 映射地址等) 所以导致了 IPv 网络地址的格式变化很大
Java 对于 IPv 网络地址的验证是通过对输入字符的循环匹配做到的 并没有采取正则表达式的做法 其匹配过程中还依赖于其它的 Java 方法
目前网络上流传的 IPv 网络地址验证的正则表达式通常都只能涵盖部分地址格式 而且表达式冗长难读 非常不易于理解
基于通用性考虑 以及为了使验证方法尽量简单易读 笔者尝试将 IPv 网络地址的格式简单分类以后 使用多个正则表达式进行验证
这种做法兼顾了通用性(基于正则表达式 所以方便用各种不同的编程语言进行实现) 以及易读性(每个独立的正则表达式相对简短);并且根据测试 支持目前所有的 IPv 网络地址格式类型 尚未发现例外
以下是笔者用 Java 编写的对于 IPv 网络地址的验证方法 此算法可被简单地用其它编程语言仿照重写
清单 验证地址
//IPv address validator matches these IPv formats //::ffff: : | : db : a : d : : a e: : //| :: a e: : : | : db : a : d : : a e: //| : db :: a e: | :: | ffff:: //And such addresses are invalid //:: a e: : : | :idb :: : | :: a //| : :: public static boolean isIPV Format(String ip) { ip = ip trim(); //in many cases such as URLs IPv addresses are wrapped by [] if(ip substring( ) equals( [ ) && ip substring(ip length() ) equals( ] )) ip = ip substring( ip length() ); return ( < pile( : ) split(ip) length) //a valid IPv address should contains no less than //and no more than : as separators && (pile( : ) split(ip) length <= ) //the address can be pressed but :: can appear only once && (pile( :: ) split(ip) length <= ) //if a pressed address && (pile( :: ) split(ip) length == ) //if starts with :: – leading zeros are pressed (((ip substring( ) equals( :: )) Pattern matches( ^::([\\da f]{ }(:)){ }(([\\da f]{ }(:)[\\da f]{ }) |([\\da f]{ })|((\\d{ } ){ }\\d{ })) ip) : Pattern matches( ^([\\da f]{ }(:|::)){ } (([\\da f]{ }(:|::)[\\da f]{ })|([\\da f]{ }) |((\\d{ } ){ }\\d{ })) ip))) //if ends with :: ending zeros are pressed : ((ip substring(ip length() ) equals( :: )) Pattern matches( ^([\\da f]{ }(:|::)){ } ip) : Pattern matches( ^([\\da f]{ }:){ }(([\\da f]{ } :[\\da f]{ })|((\\d{ } ){ }\\d{ })) ip)); }}
如何正规化 IPv 地址
在网络程序开发中 经常使用 IP 地址来标识一个主机 例如记录终端用户的访问记录等 由于 IPv 具有有零压缩地址等多种表示形式 因此直接使用 IPv 地址作为标示符 可能会带来一些问题 为了避免这些问题 在使用 IPv 地址之前 有必要将其正规化 除了通过我们熟知的正则表达式 笔者在开发过程中发现使用一个简单的 Java API 也可以达到相同的效果
清单 正规化地址
InetAddress inetAddr = InetAddress getByName(ipAddr); ipAddr = inetAddr getHostAddress(); System out println(ipAddr);
InetAddress getByName(String) 方法接受的参数既可以是一个主机名 也可以是一个 IP 地址字符串 我们输入任一信息的合法 IPv 地址 再通过 getHostAddress() 方法取出主机 IP 时 地址字符串 ipAddr 已经被转换为完整形式 例如输入 : b:e aa:: b:e aa 上述代码执行过后 零压缩部分将被还原 ipAddr 变为 : b:e aa: : : : b:e aa
如何获取本机 IPv 地址
有时为了能够注册 listener 开发人员需要使用本机的 IPv 地址 这一地址不能简单得通过 InetAddress getLocalhost() 获得 因为这样有可能获得诸如 : : : : : : : 这样的特殊地址 使用这样的地址 其他服务器将无法把通知发送到本机上 因此必须先进行过滤 选出确实可用的地址 以下代码实现了这一功能 思路是遍历网络接口的各个地址 直至找到符合要求的地址
清单 获取本机 IP 地址
public static String getLocalIPv Address() throws IOException { InetAddress inetAddress = null; Enumeration neorkInterfaces = NeorkInterface getNeorkInterfaces(); outer: while (neorkInterfaces hasMoreElements()) { Enumeration inetAds = neorkInterfaces nextElement() getInetAddresses(); while (inetAds hasMoreElements()) { inetAddress = inetAds nextElement(); //Check if it s ipv address and reserved address if (inetAddress instanceof Inet Address && !isReservedAddr(inetAddress)) { break outer; } } } String ipAddr = inetAddress getHostAddress(); // Filter neork card No int index = ipAddr indexOf( % ); if (index > ) { ipAddr = ipAddr substring( index); } return ipAddr; } / Check if it s local address or link local address or loopbackaddress @param ip address @return result / private static boolean isReservedAddr(InetAddress inetAddr) { if (inetAddr isAnyLocalAddress() || inetAddr isLinkLocalAddress() || inetAddr isLoopbackAddress()) { return true; } return false; }
为了支持 IPv Java 中增加了两个 InetAddress 的子类 Inet Address 和 Inet Address 一般情况下这两个子类并不会被使用到 但是当我们需要分别处理不同的 IP 协议时就非常有用 在这我们根据 Inet Address 来筛选地址
isReservedAddr() 方法过滤了本机特殊 IP 地址 包括 LocalAddress LinkLocalAddress 和 LoopbackAddress 读者可根据自己的需要修改过滤标准
另一个需要注意的地方是 在 windows 平台上 取得的 IPv 地址后面可能跟了一个百分号加数字 这里的数字是本机网络适配器的编号 这个后缀并不是 IPv 标准地址的一部分 可以去除
IPv /IPv 双环境下 网络的选择和测试
我们先看一下笔者所在的 IPv /IPv 开发测试环境及其配置方法
笔者所处的 IPv /IPv 双环境是一个典型的 to 双栈网络 其中存在着一个 IPv 到 IPv 的映射机制 即任意一个 IPv 地址 : a: f a: :a:b:c:d 在路由时会被默认映射为 IPv 地址 a b c d 所以路由表只有一套
在此环境内 IPv 地址与 IPv 地址的一一对应是人工保证的 如果一台客户机使用不匹配的 IPv 和 IPv 双地址 或者同时使用 DHCPv 和 DHCPv (可能会导致 IPv 地址和 IPv 地址不匹配) 会导致 IPv 的路由寻址失败
正因为如此 为了配置双地址环境 我们一般使用 DHCPv 来自动获取 IPv 地址 然后人工配置相对应的 IPv 地址
Windows 系统
Windows 及以下 不支持 IPv
Windows 和 Windows XP 使用 Windows 自带的 netsh 命令行方式添加 IPv 地址以及 DNS 例如 C:\>netsh interface ipv add address Local Area Connection : a: f a: : : : : 和 C:\>netsh interface ipv add dns Local Area Connection : a: f a: : ::
Windows 和 Windows Vista 既可以使用 Windows 网络属性页面进行配置 也可以使用类似 Windows 和 Windows XP 的 netsh 命令行来配置
Linux 系统 (以下是 IPv 的临时配置方法 即不修改配置文件 计算机重启后配置失效)
Redhat Linux 最简单的方法是使用 ifconfig 命令行添加 IPv 地址 例如 ifconfig eth inet add : a: f a: : : : : /
SUSE Linux 同上
从实践上讲 由于 Java 的面向对象特性 以及 包对于 IP 地址的良好封装 从而使得将 Java 应用从 IPv 环境移植到 IPv /IPv 双环境 或者纯 IPv 环境变得异常简单 通常我们需要做的仅是检查代码并移除明码编写的 IPv 地址 用主机名来替代则可
除此以外 对于一些特殊的需求 Java 还提供了 InetAddress 的两个扩展类以供使用 Inet Address 和 Inet Address 其中封装了对于 IPv 和 IPv 的特殊属性和行为 然而由于 Java 的多态特性 使得程序员一般只需要使用父类 InetAddress Java 虚拟机可以根据所封装的 IP 地址类型的不同 在运行时选择正确的行为逻辑 所以在多数情况下 程序员并不需要精确控制所使用的类型及其行为 一切交给 Java 虚拟机即可
具体的新增类型及其新增方法 请具体参阅 Sun 公司的 JavaDoc
另外 在 IPv /IPv 双环境中 对于使用 Java 开发的网络应用 比较值得注意的是以下两个 IPv 相关的 Java 虚拟机系统属性
preferIPv Stack=<true|false> preferIPv Addresses=<true|false>
preferIPv Stack(默认 false)表示如果存在 IPv 和 IPv 双栈 Java 程序是否优先使用 IPv 套接字 默认值是优先使用 IPv 套接字 因为 IPv 套接字可以与对应的 IPv 或 IPv 主机进行对话;相反如果优先使用 IPv 则只不能与 IPv 主机进行通信
preferIPv Addresses(默认 false)表示在查询本地或远端 IP 地址时 如果存在 IPv 和 IPv 双地址 Java 程序是否优先返回 IPv 地址 Java 默认返回 IPv 地址主要是为了向后兼容 以支持旧有的 IPv 验证逻辑 以及旧有的仅支持 IPv 地址的服务
总结
lishixinzhi/Article/program/Java/hx/201311/26767
服务器端代码,支持多用户访问,端口号9001:
package net;
import javanet;
import javaio;
public class Server extends Thread {
private ServerSocket serverSocket;
private Socket serverEndPoint;
private InputStream in;
private OutputStream out;
public Server() {
}
private Server(Socket serverEndPoint) {
thisserverEndPoint = serverEndPoint;
}
public void startService(int port) throws IOException, InterruptedException {
Systemoutprintln("service started");
serverSocket = new ServerSocket(port);
while (true)
new Server(serverSocketaccept())start();
}
public void run() {
try {
in = serverEndPointgetInputStream();
out = serverEndPointgetOutputStream();
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out);
String request;
while (true) {
if ((request = disreadUTF()) != null) {
if (requesttrim()equals("bye")
|| requesttrim()equals("exit")
|| requesttrim()equals("quit"))
break;
Systemoutprintln(serverEndPointgetInetAddress()
getCanonicalHostName()
+ " is getting '" + requesttrim() + "'");
File f = new File(requesttrim());
if (!fexists()) {
doswriteBoolean(false);
doswriteUTF("File '" + fgetPath()
+ "' doesn't exist!");
continue;
}
if (fisDirectory()) {
doswriteBoolean(false);
doswriteUTF("'" + fgetPath() + "' is a folder!");
continue;
}
FileInputStream fis = new FileInputStream(f);
int i;
int count = 0;
byte[] buf = new byte[1024];
doswriteBoolean(true);
doswriteLong(flength());
while ((i = fisread(buf)) != -1) {
doswrite(buf, 0, i);
count += i;
}
fisclose();
Threadsleep(1000);
doswriteUTF("File '" + fgetName()
+ "' has been saved in the current folder");
}
}
Systemoutprintln("Connection to "
+ serverEndPointgetInetAddress()getCanonicalHostName()
+ " is ready to close");
Threadsleep(5000);
disclose();
dosclose();
serverEndPointclose();
} catch (Exception e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
try {
new Server()startService(90011);
} catch (Exception e) {
eprintStackTrace();
}
}
}
//通过accept方法获取连接过来的客户端对象
Socket s = ssaccept();
String ip = sgetInetAddress()getHostAddress();
Systemoutprintln(ip+"connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = sgetInputStream();
byte[] buf = new byte[1024];
int len = inread(buf);
Systemoutprintln(new String(buf,0,len));
sclose();//关闭客户端
服务端接收一次,连接就关闭了,还发个屁呀
byte[] buf = new byte[1024];
int len = inread(buf);
Systemoutprintln(new String(buf,0,len));
把这几句改造一下,循环读取,关闭客户端的删掉。
import javaawt;
import javaawtevent;
import javaio;
import javanet;
import javautil;
import javautilregex;
import javaxswing;
import javaxswingtable;//一个Web的爬行者(注:爬行在这里的意思与抓取,捕获相同)
public class SearchCrawler extends JFrame{
//最大URL保存值
private static final String[] MAX_URLS={"50","100","500","1000"};
//缓存robot禁止爬行列表
private HashMap disallowListCache=new HashMap();
//搜索GUI控件
private JTextField startTextField;
private JComboBox maxComboBox;
private JCheckBox limitCheckBox;
private JTextField logTextField;
private JTextField searchTextField;
private JCheckBox caseCheckBox;
private JButton searchButton;
//搜索状态GUI控件
private JLabel crawlingLabel2;
private JLabel crawledLabel2;
private JLabel toCrawlLabel2;
private JProgressBar progressBar;
private JLabel matchesLabel2;
//搜索匹配项表格列表
private JTable table;
//标记爬行机器是否正在爬行
private boolean crawling;
//写日志匹配文件的引用
private PrintWriter logFileWriter;
//网络爬行者的构造函数
public SearchCrawler(){
//设置应用程序标题栏
setTitle("搜索爬行者");
//设置窗体大小
setSize(600,600);
//处理窗体关闭事件
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
actionExit();
}
});
//设置文件菜单
JMenuBar menuBar=new JMenuBar();
JMenu fileMenu=new JMenu("文件");
fileMenusetMnemonic(KeyEventVK_F);
JMenuItem fileExitMenuItem=new JMenuItem("退出",KeyEventVK_X);
fileExitMenuItemaddActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
actionExit();
}
});
fileMenuadd(fileExitMenuItem);
menuBaradd(fileMenu);
setJMenuBar(menuBar);
以上就是关于Java开发学习有什么技巧呢(java开发经验)全部的内容,包括:Java开发学习有什么技巧呢(java开发经验)、java网络编程方向具体该怎么去学。。。、编写一个Java程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)