连接到服务器

bad guy

使用套接字socket

Socket类非常简单易用,因为java技术隐藏了建立网络连接和通过连接发送数据的复杂过程。实际上,java.net包提供的编程接口和操作文件时所使用的接口基本相同。

下面是一个示例程序,该程序只适用于非常简单的服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.*;
import java.net.*;
import java.util.*;
public class SocketTest
{
public static void main(String[] args)
{
try
{
Socket s = new Socket("time-A.timefreq.bldrdoc.gov", 13);
//通过一个url和端口号打开一个套接字,如果失败它将抛出一个UnknownHostException异常
//如果有其他问题,它将抛出一个IOException异常
try
{
InputStream inStream = s.getInputStream();
//一旦套接字被打开,getInputStream()方法将返回一个InputStream对象
//可以使用这个对象实例化Scanner打印输出
Scanner in = new Scanner(inStream);

while (in.hasNextLine())
{
String line = in.nextLine();
System.out.println(line);
}
}
finally
{
s.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

套接字超时

在可以访问数据之前从套接字读取信息时,读操作将会被阻塞。如果此时主机不可达,那么应用将要等待很长时间,由于底层操作系统的限制而最终会导致超时。

可以调用Socket类的setSoTimeout方法设置这个超时值,若在指定时间内数据依然不能被访问,就会抛出SocketTimeoutException异常。

1
2
3
4
5
6
7
try{
Socket s=new Socket(...);
s.setSoTimeout(10000);
InputStream in = s.getInputStream();
}catch(InterruptedIOException e){
//
}

还可以对获取连接的时间加以控制,这样就不会使获取连接的过程一直阻塞

1
2
3
Socket s = new Socket();
//先构建一个无连接的套接字
s.connect(new InetSocketAddress(host,port),timeout);

因特网地址

如果需要在主机名和因特网地址之间进行转换,可以使用InetAddress类如果主机操作系统支持IPv6格式的因特网地址,java.net包也可以获取的到

1
2
3
4
InetAddress address = InetAddress.getByName("www.baidu.com");
//返回的InetAddress对象封装了一个4字节的序列
byte[] addressBytes=address.getAddress();
//得到地址序列

一些访问量较大的主机名常会对应于多个因特网地址,以实现负载均衡。当访问主机时,其因特网地址将从这三者中随机产生。可以通过调用getAllByName方法获得所有主机

1
2
3
InetAddress[] address= InetAddress.getAllByName(host);
InetAddress addressLocal=InetAddress.getLocalHost();
//获得本机IP

示例程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.net.*;
public class InetAddressTest
{
public static void main(String[] args)
{
try
{
if (args.length > 0)
{
String host = args[0];
InetAddress[] addresses = InetAddress.getAllByName(host);
for (InetAddress a : addresses)
System.out.println(a);
}
else
{
InetAddress localHostAddress = InetAddress.getLocalHost();
System.out.println(localHostAddress);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Donate comment here