Java网络编程 使用Socket类接收和发送数据(1)
通过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),并且利用多线程将这个端口范围分成不同的段进行扫描,这样可以大大提高扫描的效率。
