当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>JAVA网络编程

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

    网络应用分为客户端和服务端两部分,而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 );
       
MyConnection 1[] instances  =   new MyConnection 1[threadCount];
        
for  ( int  i  =   0 ; i  <  threadCount; i ++ )
        {
            instances[i] 
=   new MyConnection1 (minPort  +  portIncrement  *  i, minPort
                    
+  portIncrement  -   1   +  portIncrement  *  i);
            instances[i].start();
        }
    }
}

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

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

java mysocket.MyConnection1  1000   3000   20

共4页 首页 上一页 1 2 3 4 下一页 尾页 跳转到
相关内容
赞助商链接