一 ip地址和端口号
IP地址:确定网络上一个绝对地址(类似于一个房子的地址)
端口号:区分计算机软件(类似于房子的房门) 2个字节 0--65535
在同一协议下,端口号不能重复,不同协议下可以重复,1024一下的端口号一般分配给了系统用。
主机名到 IP 地址的解析通过使用本地机器配置信息和DNS来实现。要使用的特定命名服务默认情况下是本地机器配置的那个。对于任何主机名称,都返回其相应的 IP 地址。
InetAddress 类具有一个缓存,用于存储成功及不成功的主机名解析。
测试代码:
1.通过类InetAddress 获得(无构造器)
static InetAddress getLocalHost()返回本地主机
static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址。主机名可以是机器名(如"java.sun.com"),也可以是其 IP 地址的文本表示形式。
package com.sunlei.net.ip;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetDemo02 {
public static void main(String[] args) throws UnknownHostException {
//使用getLocalHost方法创建InetAddress对象
InetAddress addr = InetAddress.getLocalHost();
System.out.println(addr.getHostName());//返回计算机名
System.out.println(addr.getHostAddress());//返回ip
//根据域名得到InetAddress对象
addr = InetAddress.getByName("www.163.com");
System.out.println(addr.getHostAddress());//返回ip
System.out.println(addr.getHostName());
//根据IP得到InetAddress对象
addr = InetAddress.getByName("222.211.64.51");
System.out.println(addr.getHostAddress());
System.out.println(addr.getHostName());//返回域名
}
}
2.通过类InetSocketAddress获得(有构造器)
根据主机名和端口号创建套接字地址。尝试将主机名解析为 InetAddress。如果尝试失败,则将地址标记为未解析。
package com.sunlei.net.ip;
import java.net.InetAddress;
import java.net.InetSocketAddress;
/*
* 封装端口,在InetAddress基础上+端口*/
public class InetSocketDemo01 {
public static void main(String[] args) {
InetSocketAddress address = new InetSocketAddress("127.0.0.1",9999);
System.out.println(address.getHostName());
System.out.println(address.getPort());
InetAddress add = address.getAddress();
System.out.println(add.getHostName());//返回计算机名
System.out.println(add.getHostAddress());//返回ip
}
}
二 URL资源定位
代表一个统一资源定位符,它是指向互联网“资源”的指针。
由四部分:协议,存放资源的主机域名,端口号,资源文件名(/之后)
URL(String spee):绝对路径
URL(URL context,String spee):相对路径构建
package com.sunlei.net.url;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo01 {
public static void main(String[] args) throws MalformedURLException{
//绝对路径构建
URL url = new URL("http://www.baidu.com:80/index.html#aa?uname=sunlei");
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("相对路径:"+url.getPath());
System.out.println("锚点"+url.getRef());
System.out.println("参数"+url.getQuery());//存在锚点返回null
//相对路径创建
url = new URL("http://www.baidu.com:80/a/");
url = new URL(url,"b.txt");
System.out.println(url.toString());
}
}
html->格式化数据
CSS->美化数据
JS->交互数据
三 UDP通信(以数据为中心,非面向连接, 不安全,数据可能丢失,效率高,类似发短信)
1.客户端
(1)创建DatagramSocket类+指定端口
(2)准备数据(字节数组)
(3)打包(DatagramPacket+服务器地址及端口)
(4)发送
(5)释放资源
2.服务端
(1)创建服务端DatagramSocket类+指定端口
(2)准备接受容器(字节数组)
(3)包(接受数据)
(4)分析
(5)释放资源
package com.sunlei.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/*
* 客户端
* */
public class MyClient {
public static void main(String[] args) throws IOException {
//创建客户端+端口
DatagramSocket client = new DatagramSocket(6666);
//准备数据
String msg = "udp编程";
byte[] data = msg.getBytes();
//打包DatagramPacket(byte[] buf, int length, SocketAddress address)
DatagramPacket packet = new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
//发送
client.send(packet);
//释放
client.close();
}
}
package com.sunlei.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* 服务端
* */
public class MyServer {
public static void main(String[] args) throws IOException {
//创建服务端+端口
DatagramSocket server = new DatagramSocket(8888);
//准备接收容器
byte[] container = new byte[1024];
//封装成DatagramPacket(byte[] buf, int length)
DatagramPacket packet = new DatagramPacket(container,container.length);
//接收数据(阻塞式接收)
server.receive(packet);
//分析数据
byte[] data = packet.getData();
int len = packet.getLength();
System.out.println(new String(data,0,len));
//释放资源
server.close();
}
}
四 TCP通信(面向连接 安全 可靠 效率高低 类似打电话)
package com.sunlei.net.tcp.socket;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端+指定端口 Socket(String host, int port)
Socket client = new Socket("localhost",8888);
//接收数据
/*
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String echo = br.readLine();
System.out.println(echo);
*/
DataInputStream dis = new DataInputStream(client.getInputStream());
String echo = dis.readUTF();
System.out.println(echo);
}
}
package com.sunlei.net.tcp.socket;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//创建客户端+指定端口
ServerSocket server = new ServerSocket(8888);
//接收客户端的连接 阻塞式
Socket socket = server.accept();
System.out.println("一个客户端连接");
//发送数据
String msg = "欢迎使用";
//输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write(msg);
bw.newLine();//行结束
bw.flush();
}
}