本次博客为我在学习java编程时的总结,参考《Java网络编程 孙卫琴》一书
在客户/服务器通信模式中,客户端需要主动创建与服务器连接的Socket,服务器收到了客户端的连接请求,也会创建与客户连接的Socket。
- 以下例子的PortScanner类能够扫描主机上从1到1024之间的端口,判断这些端口是否已经被服务器程序监听。
package 端口扫描;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class PortScanner {
public static void main(String[] args){
for (int port = 1; port < 1024; port++) {
new ScanThread(port).start();
}
}
}
class ScanThread extends Thread{
private int port;
public ScanThread(int port) {
this.port = port;
}
@Override
public void run() {
try (Socket socket = new Socket("10.5.69.114", port)) {
System.out.println("端口:"+port+"是开放的");
}catch (UnknownHostException e){
System.out.println("主机连不上");
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 设定等待建立连接的超时时间
当客户端的Socket构造方法请求与服务器连接时,可能要等待一段时间。默认情况下,Socket构造方法会一直等待等待下去,知道连接成功,或者出现异常。Socket构造方法请求连接时,受底层网络的传输速度的影响,可能会处于长时间的等待状态。如果希望限定等待时间,这时需要使用一个不带参数的构造方法:
Socket socket=new Socket();
SocketAddress remoteAddr=new InetSocketAddress("localhost",8000);
socket.connect(remoteAddr,60000);//等待时间为一分钟
以上代码用于连接到本地机器上的监听端口8000的服务器程序,等待连接的最长时间为1分钟。如果在1分钟内连接成功,则connect()方法顺利返回;如果在1分钟之内出现异常,则抛出该异常;
如果超过了1分钟后,既没有连接成功,也没有出现其他异常,那么会抛出SocketTimeoutExpection.Socket类的connect(SocketAddress endpoint,int timeout)方法负责连接服务器,参数endpoint指定服务器的地址,参数timeout设定超时时间,以毫秒为单位。如果参数timeout的值设为0,表示永远不会超时。
3.设定服务器的地址
InetAddress类表示服务器的IP地址,InetAddress类提供了一系列的静态工厂方法,用于构造自身的实例。例如
//返回本机的IP地址
InetAddress addr1=InetAddress.getLocalHost();
//返回代表"222.34.5.7"的IP地址
InetAddress addr2=InetAddress.getByName("222.34.5.7");
//返回域名为"www.javathinker.org"的IP地址
InetAddress addr3=InetAddress.getByName("www.javathinker.org");
4.设定客户端的地址
在一个Socket对象中既包含远程服务器的IP地址和端口信息,也包括本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口端口则有操作系统随机分配,如果一个主机同时属于两个以上的网络,它就有可能拥有两个以上的IP地址。例如,一个主机在Internet网络中的IP地址为“222.67.1.34”,在一个局域网中的IP地址为“112.5.4.3”。假定这个主机上的客户程序希望和同一个局域网上的一个服务器程序(地址为112.5.4.45:8000)通信,客户端可按照如下方法构造Socket对象:
InetAddress remoteAddr=InetAddress.getByName("112.5.4.45");
InetAddress localAddr=InetAddress.getByName("112.5.4.3");
Socket socket1=new Socket(remoteAddr,2345);//客户端使用端口2345