· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

Java网络编程 使用Socket类接收和发送数据 (1)

发布时间:2009.05.15 04:43     来源:blogjava    作者:nokiaguy

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础、各式各样的连接方式、get和set方法、连接过程中的超时以及关闭网络连接等。

在本文中,我们将讨论使用Socket类的基本步骤和方法。一般网络客户端程序在连接服务程序时要进行以下三步操作。

1.连接服务器

2.发送和接收数据

3.关闭网络连接

一、连接服务器

在客户端可以通过两种方式来连接服务器,一种是通过IP的方式来连接服务器,而另外一种是通过域名方式来连接服务器。

其实这两种方式从本质上来看是一种方式。在底层客户端都是通过IP来连接服务器的,但这两种方式有一定的差异,如果通过IP方式来连接服务端程序,客户端只简单地根据IP进行连接,如果通过域名来连接服务器,客户端必须通过DNS将域名解析成IP,然后再根据这个IP来进行连接。

在很多程序设计语言或开发工具中(如C/C++、Delphi)使用域名方式连接服务器时必须自己先将域名解析成IP,然后再通过IP进行连接,而在Java中已经将域名解析功能包含在了Socket类中,因此,我们只需象使用IP一样使用域名即可。

通过Socket类连接服务器程序最常用的方法就是通过Socket类的构造函数将IP或域名以及端口号作为参数传入Socket类中。Socket类的构造函数有很多重载形式,在这一节只讨论其中最常用的一种形式:public Socket(String host, int port)。从这个构造函数的定义来看,只需要将IP或域名以及端口号直接传入构造函数即可。下面的代码是一个连接服务端程序的例子程序:

package mysocket;

import java.net.*;

public class MyConnection

{

public static void main(String[] args)

{

try

{

if (args.length > 0)

{

Socket socket = new Socket(args[0], 80);

System.out.println(args[0] + "已连接成功!");

}

else

System.out.println("请指定IP或域名!");

}

catch (Exception e)

{

System.err.println("错误信息:" + e.getMessage());

}

}

}

在上面的中,通过命令行参数将IP或域名传入程序,然后通过Socket socket = new Socket(args[0], 80)连接通过命令行参数所指定的IP或域名的80端口。由于Socket类的构造函数在定义时使用了throws,因此,在调用Socket类的构造函数时,必须使用try…catch语句来捕捉错误,或者对main函数使用throws语句来抛出错误。

测试正确的IP

java mysocket.MyConnection 127.0.0.1

输出结果:127.0.0.1已经连接成功!

测试错误的IP

java mysocket.MyConnection 10.10.10.10

输出结果:错误信息:Connection timed out: connect

注:10.10.10.10是一个并不存在的IP,如果这个IP在你的网络中存在,请使用其它的不存在的IP。

测试正确的域名

java mysocket.MyConnection www.ptpress.com.cn

输出结果:www.ptpress.com.cn已经连接成功!

测试错误的域名

java mysocket.MyConnection www.ptpress1.com.cn

输出结果:错误信息:www.ptpress1.com.cn

使用Socket类连接服务器可以判断一台主机有哪些端口被打开。下面的代码是一个扫描本机有哪些端口被打开的程序。

package mysocket;

import java.net.*;

public class MyConnection1 extends Thread

{

private int minPort, maxPort;

public MyConnection1(int minPort, int maxPort)

{

this.minPort = minPort;

this.maxPort = maxPort;

}

public void run()

{

for (int i = minPort; i <= maxPort; i++)

{

try

{

Socket socket = new Socket("127.0.0.1", i);

System.out.println(String.valueOf(i) + ":ok");

socket.close();

}

catch (Exception e)

{

}

}

}

public static void main(String[] args)

{

int minPort = Integer.parseInt(args[0]), maxPort = Integer

.parseInt(args[1]);

int threadCount = Integer.parseInt(args[2]);

int portIncrement = ((maxPort - minPort + 1) / threadCount)

+ (((maxPort - minPort + 1) % threadCount) == 0 ? 0 : 1);

MyConnection1[] instances = new MyConnection1[threadCount];

for (int i = 0; i < threadCount; i++)

{

instances[i] = new MyConnection1(minPort + portIncrement * i, minPort

+ portIncrement - 1 + portIncrement * i);

instances[i].start();

}

}

}

上面代码通过一个指定的端口范围(如1至1000),并且利用多线程将这个端口范围分成不同的段进行扫描,这样可以大大提高扫描的效率。

可通过如下命令行去运行例程4-2。

java mysocket.MyConnection1 1000 3000 20

1 2 3 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· Visual Studio 2010 Beta 1有望下周发布 (05-14) · 有关J2ME新手程序员开发入门的几点说明 (05-13)
· 菜鸟课堂:使用Java编写Oracle存储过程 (05-13) · Java进阶:在Java中应用设计模式Singleton (05-11)
· 利用 WAS CE v2.1 创建基于 JMS 的应用 (05-07) · 基于 jsTree 的无限级树JSON数据的转换 (05-06)
· Java动态:2009年的Java技术发展趋势展望 (05-05) · Jboss企业版VS社区版对比全攻略 (05-05)
· J2ME开发经验:J2ME应用程序内存优化三招 (05-04) · 金蝶袁红岗:Oracle比Sun更能推动Java发展 (04-28)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:谷歌发布PC操作系统Chrome OS
·芯能量 新动力 兴经济:..
·专题:英特尔与AMD和解 ..
·专题:惠普27亿收购3Com..
专题:
·专题:诺基亚危局已现 ..
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
 
·惠普123459黑白激打家族..
·云计算格局初现 三大阵..
·分析:虚拟化在高性能计..
2009 IBM动态架构新动力论坛
·直播:第八届中国系统与..
·专题:置身智慧海洋——..
·专题:让物品开口说话 ..