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

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








һϢϵͳܱǸύлʵкϵͳĹؼʻIPܵ˷ƣβЧϵͳѼ¼IPύݡע⣬ҪύκΥҹ涨ݣصϢΪgooglesyndication
成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)

电脑街 http://www.computerj.com您的好朋友。

{

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),并且利用多线程将这个端口范围分成不同的段进行扫描,这样可以大大提高扫描的效率。