Java提供了大量内置的网络操作功能,包含于java.net包中
通过这个包提供的类和接口,可以实现基于“流”的通信,或者基于“包”的通信
URL url1 = new URL("https://www.baidu.com");
URL base = new URL("http://www.baidu.com");
URL url2 = new URL(base, "1.html");
URL url3 = new URL(base, '2.html');
URL url4 = new URL("http", "www.baidu.com", "1.html");
URL url5 = new URL("http", "www.baidu.com", "8080", "1.html");
try {
URL ...
} catch (MalformedURLException e) {
e.printStackTrace();
}
http://www.baidu.com:80/abc/123?abc=123
url1.getHost(); // www.baidu.com
url1.getPort(); // 80
url1.getPath(); // /abc/123
url1.getProtocal(); // http
uri1.getQuery(); // abc=123
JEditorPane pane = new JEditorPane();
pane.setPage(location);
pane.addHyperLinkListener(new HyperLinkListner() {
@Override
public void HyperLinkUpdate(HyperLinkEvent e) {
e.getUrl().toString(); // 得到地址
e.getEventType(); // -> HyperLinkEvent.EventType.ACTIVITED
// 有
/**
ACTIVITED
ENTERED
EXITED
*/
}
})
InetAddress address = InetAddress.getByName("www.baidu.com");
System.out.println(address); // -> xxx.xxx.xxx.xxx
端口是0~65535的一个数字
大多数操作系统将1024内的端口号保留给系统服务,因此一般情况下不应该将这些端口指定为用户程序中的连接端口
25 -> SMTP
80 -> HTTP
69 -> TFTP
21 -> FTP
23 -> Telnet
53 -> DNS
……
通信过程中,进程必须按运输层的相关协议,建立进程间的逻辑通信的通路
运输层使用的协议
依照不同的协议,在运输层需要建立不同的套接字,将网络数据流连接到程序上
HostA, hostB的通信过程
ServerSocket server = new ServerSocket(6666, 100); // 设定端口号和队列长度
Socket connection = server.accept(); // 等待客户端连接,连接成功返回Socket对象
ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream());
input.readObject();
output.writeObject();
connection.close();
// 可能会有两个异常
// BindException -> 端口号被占用
// IOException -> IO操作错误
Socket connection = new Socket("110.110.110.100", 6666);
ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream());
connection.close();
// 可能会有两个异常
// UnknownHostException -> 未知的主机号
// IOException -> IO操作错误
Socket s ...
s.getInetAddress(); // 获得ip地址等
DatagramSocket socket = new DatagramSocket(6666); // 定义套接字 绑定本地的一个端口,等待客户端请求
byte[] buf = new byte[256]; // 分配一个字节类型的数组用于接受客户端的请求信息
DatagramPacket packet = new DatagramPacket(buf, 256); // 创建一个DatagramPacket用于接受信息
socket.receive(packet); // 在客户端的请求报道前一直等待
InetAddress address = packet.getAddress(); // 获得地址和端口号
int port = address.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet); // 发送数据报
socket.close(); // 关闭socket
DatagramSocket socket = new DatagramSocket();
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, 256, address, port);
socket.send(packet);
byte[] sendBuf = new byte[256];
packet = new DatagramPacket(sendBuf, 256);
socket.receive(packet); // 没有到就一直等待,实用程序设置时间限度
String received = new String(packet.getData(), 0);
/**
new String(byte[] buf, int offset, int length); // 字节数组 偏移位置 长度
byte data[] = received.getBytes(); // 字符串转化为byte[]
*/
System.out.println(received);