网络通信协议:
- 应用层:
- HTTP:超文本传输协议
- FTP:文本传输协议
- SMTP: 邮件发送协议
- POP: 邮件接收协议
- 传输层:
TCP:传输控制协议(三次握手)
UDP: 用户数据包协议
- 网络层
- IP: 网络协议
- 数据链路层
- 物理层
IP:
- 网络地址:唯一标识网络上的每一台计算机
- 地址组成:32位,由4个8位二进制数组成。
- 本地ip的表现形式:
- 127.0.0.1
- localhost
- 局域网ip(可以使用ipconfig指令查询)
- 广域网ip(百度直接搜索ip)
- 常用的指令:
- ipconfig: 查看本机所有网络的配置
- ping: 可以测试网络是否通畅,可以查看域名映射的ip
DNS:
- Domain Name System, 域名解析系统
- DNS是一个分布式服务器系统,实现了域名和ip地址的隐射
- 我们请求域名(www.baidu.com),会先进行DNS的解析,得到ip地址后,继续请求ip地址对应的主机。
java.net包下的类
1. URL类:
url:统一资源定位符,例如:http://www.longge.vip//study/javacore.avi;
分析:协议://域名(ip)/资源路径/资源名
- 构造方法
URL url = new URL("http://www.longge.vip/study.java");
System.out.println(url);
- encode(),将网站中的中文字符加密
String encodeStr = URLEncoder.encode("http://www.longge.vip/study","utf-8");
- 将网址中的乱码解码 decode();
String decoderStr = URLDecoder.decode(emcoderStr,"utd-8")
- 查看本机的ip
InetAddress localHost = InetAddress.getLocalHost();
- 查看域名映射的ip
InetAddress ip1 = InetAddress.getByName("www.baidu.com");
- 查看域名映射的所有ip
InetAddress[] ips = InetAddress.getAllByName("www.taovao.com");
- 通过ip地址创建对象
InetAddress ip2 = InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, 1, (byte)172});
实现网络编程:
- TCP + Socket实现网络编程
- UDP + Socket实现网络编程
TCP | UDP |
---|---|
面向连接的 | 面向非连接 |
是安全的 | 是不安全的 |
比较慢 | 比较快 |
适合传输大文件 | 适合传输小文件 |
注意:
输出流关闭造成的Socket关闭
- 再客户端或者服务端通过socket.shutdownOutput()都是单项关闭的,即关闭客户端的输出流并不会关闭服务端的输出流,所以是一种单方向的关闭流
- 通过socket.shutdownOutput()关闭输出流,但socket任然是连接状态,连接并未关闭
- 如果直接关闭输入流或者输出流,即:in.close()或者out.close().会直接关闭socket
TCP + Socket 网络编程:
//TCP client
private static Scanner sc = new Scanner(System.in);
public stataic void main(Stringp[[ args) throes Exception{
//1. 创建Socket对象,指定主机地址和端口号
Socket client = new Socket("localhost" , 1904);
System.out.println("客户端启动完毕!");
//2.创建一个输出流用于发送数据给主机
DataOuputStream dos = new DataOutputStream(client.getOutputStream());
//3.发送数据
dos.writeUTF(sc.next());
//4. 创建一个输入流用于接收服务器发送的数据
DataInputStream dis = new DataInputStream(client.getInputStream());
//5.接收服务器发送的请求
String message = dis.readUTF();
System.out.println(message);
}
//TCP server
//1.创建ServerSocket对象,指定端口号
ServerSocket server = new ServerSocket(1904);
System.out.println("服务器启动完毕");
//2. 监听客户端请求
Socket client = server.accept();
System.out.println("服务器监听到客户端连接!")
//3. 创建输入流用于接收客户端发送的数据
DataInputStream dis = new DataInputStream(client.getInputStream());
//4. 获取客户端发送的数据
String message = dis,readUTF();
System.out.println(message);
//5.创建输出流用于发送消息到客户端
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
//6. 发送数据
dos.writeUTF("你好,我是服务器");
//7.关闭资源
dos.close();
dis.close();
client.close();
server.close();
UDP + Socket 实现网络编程:
//client1
public static void main(String[] args) throws IOException{
//1. 创建DatagramSocket对象,指定端口号
DatagramSocket client1 = new DatagramSocket(6666);
//2. 创建DatagramPaclet对象,用于包装数据
String message = "hello, 我是客户端1";
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("localhost"), 8888);
//3. 发送打包好的数据
client1.send(packet);
//4. 关闭资源
client1.close();
}
//client2
public static void main(String[] args) throws Exception{
//1. 创建DatagramSocket对象
DatagramSocket client2 = new DatagramSocket(8888);
//2. 接收客户端1发来的请求
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
client2.receive(packet);
//3. 查看接收到的数据
byte[] data = packet.getData();
System.out.println(new String(data);
//关闭资源
client2.close();
}
作业:
实现控制台群聊功能