设为首页收藏本站language 语言切换
查看: 1342|回复: 0
收起左侧

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

[复制链接]
发表于 2010-2-20 14:00:32 | 显示全部楼层 |阅读模式
<p >网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础、各式各样的连接方式、get和set方法、连接过程中的超时以及关闭网络连接等。<p ><p >在本文中,我们将讨论使用Socket类的基本步骤和方法。一般网络客户端程序在连接服务程序时要进行以下三步操作。<p ><p >1.连接服务器<p ><p >2.发送和接收数据<p ><p >3.关闭网络连接<p ><p >一、连接服务器<p ><p >在客户端可以通过两种方式来连接服务器,一种是通过IP的方式来连接服务器,而另外一种是通过域名方式来连接服务器。<p ><p >其实这两种方式从本质上来看是一种方式。在底层客户端都是通过IP来连接服务器的,但这两种方式有一定的差异,如果通过IP方式来连接服务端程序,客户端只简单地根据IP进行连接,如果通过域名来连接服务器,客户端必须通过DNS将域名解析成IP,然后再根据这个IP来进行连接。<p ><p >在很多程序设计语言或开发工具中(如C/C++、Delphi)使用域名方式连接服务器时必须自己先将域名解析成IP,然后再通过IP进行连接,而在Java中已经将域名解析功能包含在了Socket类中,因此,我们只需象使用IP一样使用域名即可。<p ><p >通过Socket类连接服务器程序最常用的方法就是通过Socket类的构造函数将IP或域名以及端口号作为参数传入Socket类中。Socket类的构造函数有很多重载形式,在这一节只讨论其中最常用的一种形式:public Socket(String host, int port)。从这个构造函数的定义来看,只需要将IP或域名以及端口号直接传入构造函数即可。下面的代码是一个连接服务端程序的例子程序:<p ><p ><p >package mysocket;<p ><p >import java.net.*;<p ><p >public class MyConnection<p >{<p >    public static void main(String[] args)<p >    {<p >        try<p >        {<p >            if (args.length > 0)<p >            {<p >                Socket socket = new Socket(args[0], 80);<p >                System.out.println(args[0] + "已连接成功!");<p >            }<p >            else<p >                System.out.println("请指定IP或域名!");<p >        }<p >        catch (Exception e)<p >        {<p >            System.err.println("错误信息:" + e.getMessage());<p >        }<p >    }<p >}<p ><p ><p >在上面的中,通过命令行参数将IP或域名传入程序,然后通过Socket socket = new Socket(args[0], 80)连接通过命令行参数所指定的IP或域名的80端口。由于Socket类的构造函数在定义时使用了throws,因此,在调用Socket类的构造函数时,必须使用try…catch语句来捕捉错误,或者对main函数使用throws语句来抛出错误。<p ><p >测试正确的IP<p ><p >java mysocket.MyConnection 127.0.0.1<p ><p >输出结果:127.0.0.1已经连接成功!<p ><p >测试错误的IP<p ><p >java mysocket.MyConnection 10.10.10.10<p ><p >输出结果:错误信息:Connection timed out: connect<p ><p >注:10.10.10.10是一个并不存在的IP,如果这个IP在你的网络中存在,请使用其它的不存在的IP。<p ><p >测试正确的域名<p ><p >java mysocket.MyConnection www.ptpress.com.cn<p ><p >输出结果:www.ptpress.com.cn已经连接成功!<p ><p >测试错误的域名<p ><p >java mysocket.MyConnection www.ptpress1.com.cn<p ><p >输出结果:错误信息:www.ptpress1.com.cn<p ><p ><p >使用Socket类连接服务器可以判断一台主机有哪些端口被打开。下面的代码是一个扫描本机有哪些端口被打开的程序。<p ><p ><p >package mysocket;<p ><p >import java.net.*;<p ><p >public class MyConnection1 extends Thread<p >{<p >    private int minPort, maxPort;<p ><p >    public MyConnection1(int minPort, int maxPort)<p >    {<p >        this.minPort = minPort;<p >        this.maxPort = maxPort;<p >    }<p ><p >    public void run()<p >    {<p >        for (int i = minPort; i <= maxPort; i++)<p >        {<p >            try<p >            {<p >                Socket socket = new Socket("127.0.0.1", i);<p >                System.out.println(String.valueOf(i) + "k");<p >                socket.close();<p >            }<p >            catch (Exception e)<p >            {<p >            }<p >        }<p >    }<p >    public static void main(String[] args)<p >    {<p >        int minPort = Integer.parseInt(args[0]), maxPort = Integer<p >                .parseInt(args[1]);<p >        int threadCount = Integer.parseInt(args[2]);<p >        int portIncrement = ((maxPort - minPort + 1) / threadCount)<p >                + (((maxPort - minPort + 1) % threadCount) == 0 ? 0 : 1);<p >        MyConnection1[] instances = new MyConnection1[threadCount];<p >        for (int i = 0; i < threadCount; i++)<p >        {<p >            instances = new MyConnection1(minPort + portIncrement * i, minPort<p >                    + portIncrement - 1 + portIncrement * i);<p >            instances.start();<p >        }<p >    }<p >}<p ><p ><p >上面代码通过一个指定的端口范围(如1至1000),并且利用多线程将这个端口范围分成不同的段进行扫描,这样可以大大提高扫描的效率。<p ><p >可通过如下命令行去运行例程4-2。<p ><p >java mysocket.MyConnection1 1000 3000 20                                 <p align="center"><font color="FF0000" >1</font>23<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-7 17:13 , Processed in 0.055764 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

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