在数据在互联网中从一个主机到另一个主机的传递之时,它被分割成大小不同但是有限的数据包中(datagrams)。如果要发送的数据大于了数据包的最大大小,它就会被分割成数个包发送,这样做的好处是,如果其中有一个包丢失,那么只需要重传一个包,而不必把所有的包重传。如果包抵达的顺序不同,也会在接收点重新组转完毕。
这一操作对程序员来说是透明的,我们工作在高层抽象的socket上。socket提供了两个主机之间可靠地连接。这样子,你就不需要考虑数据包的编码, 数据包的分割,数据包的重传或者是数据包的组装。Scoket提供这四种基本操作:
1.远程连接到一个机器
2.发送数据
3.接收数据
4.关闭连接
java.net.socket是一个network socket提供了这四种基本操作。在这四种操作中,没有一个抽象了协议,这个类就是为了网络客户端和服务器的连接设计的。为了创建一个连接,你调用socket构造函数中的一种。每一个socket对象仅仅连接到一个指定的远程主机。如果要连接到不同的主机,你必须创建一个新的socket对象:
public Socket (String host, int port) throws UnknownHostException, IOException
public Socket(InteAddress address, int port) throws IOException
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
host可以是像“www.huawei.com"这样子的,或者127.0.9.1这样。这个参数也可以通过java.net.InetAddress传入。
port参数指的是远程主机要连接的端口,0~65535.每一个服务都有他们指定的端口。许多知名的服务都运行在知名的端口上。比如HTTP运行在80端口中。
通过socket来发送接收数据是通过InputStream和 OuputStream
public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException
同样的,也有关闭socket连接的方法
public synchronized void close() throws IOException
如下的代码连接到一个网络服务器然后下载一个特定的URL地址。然而这里使用的是Socket而不是URL Connection,所以头部信息需要我们自己处理。
public class SocketTyper {
public static void main(String[] args) {
if(args.length==0) {
System.err.println("Usage: java SocketTyper url1 url2..");
return;
}
for(int i=0;i65535) {
port = 80;
}
Socket s = new Socket(host,port);
String request = "GET"+file+"HTTP/1.0\r\n"+"User-Agent:MechaMozilla\r\nAccept:text*\r\n\r\n";
byte[] b = request.getBytes();
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
out.write(b);
out.flush();
StreamCopier.copy(in,System.out);
in.close();
out.close();
s.close();
} catch (MalformedURLException e){
} catch (IOException e) {
}
}
}
}