1、URL
定义:URL(Uniform Resource Locater)是统一资源定位器的简称, URL的值表示网络上某个资源(如打印机、文件)的地址,因此只要按URL规则定义某个资源,那么网络上的其他程序就可以通过URL来访问它。
构成:URL用来网络资源定位,它的值由5部分组成,格式如下:
<传输协议>://<主机名>:<端口号>/<文件名> #<引用>
URL的组成如下:
使用的协议protocol (http, ftp, file…)
资源位置
主机名hostname (即域名,也可使用IP地址)
端口号port ,标识一个特定的服务。用于区 分同一台主机上进行通讯的不同应用进程(www服务端口默认为80)
文件名filename ,一般为路径加上文件名
引用reference ,指向资源文件的某一个位置
说明:
http://java.sun.com就相等同于 http://java.sun.com/index.html。
引用(reference)为资源内的某个引用,用来定位显示文件内容的位置,如http://java.sun.com/index.html#chapter1。例:URL引用示例.html
并非所有的URL都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的。
2、URL类
URL类中定义了许多简单实用的方法,利用它们可以进行一些有关URL的操作。
3、通过URL获取网络信息与资源
一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性。
//实例1:获取网络站点的属性信息
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class NetworkInfo {
public static void main(String[] args) throws IOException {
URL url = null;
try {
url = new URL("http://127.0.0.1:8080/index.jsp");
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println("Protocol:" + url.getProtocol());
System.out.println("HostName:" + url.getHost());
System.out.println("PortNumber:" + url.getPort());
System.out.println("FileName:" + url.getFile());
System.out.println("Reference:" + url.getRef());
}
}
4、URLConnection
实际应用中,只能读取数据是不够的,很多情况下,我们都需要将一些信息发送到服务器中去,这就要求我们能够实现同网络资源的双向通信,URLConnection类就是用来解决这一问题的。
类URLConnection也是定义在包java.net里,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。URLConnection是以HTTP协议为中心的类,其中很多方法只有在处理HTTP的URL时才起作用。
抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:
1) 通过在 URL 上调用 openConnection 方法创建连接对象。
2) 操作设置参数和一般请求属性。
3) 使用 connect 方法建立到远程对象的实际连接。
4) 远程对象变为可用。远程对象的头字段和内容变为可访问。
1.建立连接
URL url=new URL(“http://www.yahoo.com/”);
URLConnection con=url.openConnection();
2. 向服务器端送数据
PrintStream ps=
new PrintStream(con.getOutputStream());
ps.println(string_data);
3. 从服务器读数据
DataInputStream dis=
new DataInputStream(con.getInputStream());
dis.readLine();
5、Socket编程
1)Socket通信的一般结构
//例1:显示本机IP地址
import java.net.*;
class LocalIP {
public static void main(String[] args) {
InetAddress ip = null;
try {
ip = InetAddress.getLocalHost();//获取IP地址对象
} catch (UnknownHostException e) {
}
System.out.println(ip.getHostAddress());//显示IP地址
System.out.println(ip.getHostName());//显示主机名
}
}
//例2:根据主机名称,显示对应的IP地址。
import java.net.*;
import java.util.Scanner;
public class NetTool {
//从命令行读取主机名称
public static String readline() throws Exception {
System.out.print("请输入主机名:");
Scanner reader = new Scanner(System.in);
String s = reader.nextLine();
return s;
}
//输出主机信息
public static void printHostMeg(InetAddress ip) {
System.out.println("HostName: " + ip.getHostName());
System.out.println("HostAddress: " + ip.getHostAddress());
System.out.println("Host: " + ip);
}
public static void main(String[] args) throws Exception {
String s = readline();//从命令行读取主机名称
try {
InetAddress ip = InetAddress.getByName(s); // 获取InetAddress对象
printHostMeg(ip); // 显示主机信息
} catch (UnknownHostException e) {
System.err.println("名称有误或者网络不通!");
}
}
}
Socket中文译名是“套接字”,由主机号、端口号和协议名三部分主要内容组成。
Socket是TCP/IP协议的编程接口,一个Socket由一个IP地址和一个端口号唯一确定。
Socket有两种模式:流套接字(stream socket)和数据报套接字(datagram socket)。
流套接字提供了面向连接的网络服务,采用TCP协议;数据报套接字则采用无连接的UDP协议。
java.net包中提供了支持流套接字开发的ServerSocket与Socket类;支持数据报套接字开发的DatagramSocket类和DatagramPacket类。
2)TCP Socket编程
/*服务端程序分析:服务端在6666端口监听客户端的连接请求,
与客户端建立连接后,显示出当前连接数及客户端的IP地址,
接收、显示客户端发送的消息,并向客户端回送消息。*/
import java.net.*;
import java.io.*;
public class EchoServer {
static int num = 0;
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666);
System.out.println("Server Running");
while (true) {
EchoServer.num++;
Socket client = ss.accept();
String cno = "Connection " + num;
System.out.println(cno + " from: " + client.getInetAddress());
DataInputStream in = new DataInputStream(client.getInputStream());
DataOutputStream out = new DataOutputStream(client.getOutputStream());
//为了防止乱码,一般在发送端用writeUTF方法写,接收端用readUTF方法读。
String s = in.readUTF();//读取UTF格式的字符串
System.out.println(cno + " say:" + s);
out.writeUTF("You are welcome~~~~");//写UTF格式的字符串
System.out.println("Welcome OK!");
out.close();
client.close();
}
}
}
/*客户端程序分析:客户端连接服务器后,向服务端发送一条消息,
* 并接收、显示服务端回送的消息。*/
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 6666);
DataOutputStream out = new DataOutputStream(s.getOutputStream());
out.writeUTF("I am coming");
DataInputStream in = new DataInputStream(s.getInputStream());
System.out.println(in.readUTF());
s.close();
}
}
3)UDP Socket编程
/*服务端程序分析:服务端在6000端口监听客户端的请求,
接收、显示客户端发送的消息,并向客户端回送消息。*/
import java.net.*;
import java.io.*;
public class EchoServer {
public static void main(String[] args) throws Exception {
try {
DatagramSocket ds = new DatagramSocket(6000);//1 创建数据报套接字
byte[] buf = new byte[100];
DatagramPacket dp = new DatagramPacket(buf, 100);//2 建立接收数据的UDP包
ds.receive(dp);//3 接收信息UDP包
System.out.println(new String(buf, 0, dp.getLength()));
//4 发送信息UDP包
String str = "Welcome you!";
DatagramPacket dpSend = new DatagramPacket(str.getBytes(),
str.length(),
dp.getAddress(),
dp.getPort());
ds.send(dpSend);
ds.close();//5 关闭数据报套接字
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/*客户端程序分析:客户端连接服务器后,向服务端发送一条消息,
* 并接收、显示服务端回送的消息。*/
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws Exception {
try {
DatagramSocket ds = new DatagramSocket();//1 创建一个数据报套接字
String str = "Hello,this is zhangsan";
DatagramPacket dp = new DatagramPacket(str.getBytes(),
str.length(),
InetAddress.getByName("localhost"),
6000);//2 建立要发送的UDP包
ds.send(dp); //3 发送UDP包
//4 接收UDP包
byte[] buf = new byte[100];
DatagramPacket dpRecv = new DatagramPacket(buf, 100);
ds.receive(dpRecv);
System.out.println(new String(buf, 0, dpRecv.getLength()));
ds.close();//5 关闭数据报套接字
} catch (Exception ex) {
ex.printStackTrace();
}
}
}