Java网络编程01
21/04/09
网络
概念
- 有点和线构成,表示诸多对象间的相互联系
计算机网络
- 为实现资源共享和信息传递,用过通信线路连接起来的若干主机(Host)
- 互联网:(Internet)点与点相连
- 万维网:(WWW - World Wide Web)端与端相连
- 物联网:(Iot - Internet of things)物与物相连
- **网络编程:**让计算机与计算机之间建立连接、进行通信
网络模型
OSI模型&TCP/IP模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTWxnyYz-1617950341453)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20210409121038745.png)]
通信协议
TCP/UDP
- TCP协议:
Transmission Control Protocol传输控制协议
- 是一种面向连接、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次捂手,断开连接的过程需要四次挥手
- UDP协议:
User Datagram Protocol用户数据报协议
- 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB
IP与端口
了解IP
- IP协议:
Internet Protocol Address互联网协议地址/网络协议地址
- 分配给互联网设备的数字标签(唯一标识)
- IP地址分为两种:
- IPV4:
4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位整数可以转换为一个0~255的十进制整数
- 格式: D.D.D.D
- 例如: 255.255.255.255
- IPV6:
16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每6位整数可以转换为一个0~65535的十进制数
- 格式: X.X.X.X.X.X.X.X
- 例如: FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
IPV4的应用分类
- A类: 政府机构,1.0.0.1~126.255.255.254
- B类: 中型企业,128.0.0.1~191.255.255.254
- C类: 个人用户,192.0.0.1~223.255.255.254
- D类: 用于组播,224.0.0.1~239.255.255.254
- E类: 用于实验,240.0.0.1~255.255.255.254
- 回环地址: 127.0.0.1,指本机,一般用于测试使用
- 查看IP命令: ipconfig
- 测试IP命令: ping D.D.D.D
网络编程
InetAddress类
- 概念: 表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法
- 方法:
- public static InetAddress getLocalHost() //获得本机主机地址对象
- public static InetAddress getByName(String host) //根据主机名称获得地址对象
- public static InetAddress[] getAllByName(String host) //获得所有相关地址对象
- public String getHostAddress() //获取IP地址字符串
- public String getHostName() //获取IP地址主机名
- getPort() //获取端口号
package com.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAddress {
public static void main(String[] args) {
try {
// 127.0.0.1 查询本机ip
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
InetAddress inetAddress3 = InetAddress.getByName("localhost");
InetAddress inetAddress4 = InetAddress.getLocalHost();
System.out.println(inetAddress1);
System.out.println(inetAddress3);
System.out.println(inetAddress4);
// 查询网站地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress2);
// 常用方法
//System.out.println(inetAddress2.getAddress());
System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
System.out.println(inetAddress2.getHostAddress());//Ip
System.out.println(inetAddress2.getHostName());//域名或电脑名
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
输出结果:
/127.0.0.1
localhost/127.0.0.1
DESKTOP-LKAPH2R/10.120.60.214
www.baidu.com/110.242.68.4
110.242.68.4
110.242.68.4
www.baidu.com
进程完成,退出码 0
Port(端口)
- 端口号: 在通信实体上进行网络通讯的程序的唯一标识
端口表示计算机上的一个程序的进程:
- 不同的进程有不同的端口号!用来区分软件!
- 被规定在0~65535
- TCP,UDP:65535*2 单个写一下,端口号不能冲突
- 端口分类:
- 共有端口0~1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23
- 程序注册端口:1024~49151,分配用户或者程序
- Tomcat:8080
- MySQL:3306
- Oracle:1521
- 动态、私有的:49152~65535
基于TCP的网络编程(Socket)
- Socket编程:
- Socket(套接字)是网络中的一个通信节点
- 分为客户端Socket与服务端ServerSocket
- 通信要求: IP地址 + 端口号
Socket编程开发步骤
- 建立通信连接(会话):
- 创建ServerSocket,指定端口号
- 调用accept等待客户端接入
- 客户端请求服务器:
- 创建Socket,指定服务器IP + 端口号
- 使用输出流,发送请求数据给服务器
- 使用输入流,接收响应数据到客户端(等待)
- 服务器响应客户端:
- 使用输入流,接收请求数据到服务器(等待)
- 使用输出流,发送响应数据给客户端
服务器和客户端相互请求问好案例
客户端
package com.net;
import sun.nio.cs.UTF_32;
import java.io.*;
import java.net.Socket;
/*
* 客户端
*/
public class Client {
public static void main(String[] args) throws IOException {
//1.创建客户端(套接字),连接指定的IP + 端口号
Socket client = new Socket("127.0.0.1",6666);
//2.获取输入输出流
InputStream inputStream = client.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
OutputStream outputStream = client.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
PrintWriter printWriter = new PrintWriter(outputStreamWriter);
//3.发送数据
printWriter.println("你好,我是客户端!");
printWriter.flush();//刷新缓冲区
//4.接收响应数据
String message = bufferedReader.readLine();
System.out.println("服务器客户端用户:"+ message);
//5.关闭流和客户端
bufferedReader.close();
printWriter.close();
client.close();
}
}
服务器端
package com.net;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 服务器端
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.创建服务器端(套接字)
ServerSocket server = new ServerSocket(6666);
System.out.println("服务器已启动");
//2.调用accept等待客户端
Socket client = server.accept();
//3.通过客户端获取输入输出流
InputStream inputStream = client.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
OutputStream outputStream = client.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
PrintWriter printWriter = new PrintWriter(outputStreamWriter);
//4.读取数据
String message = bufferedReader.readLine();
System.out.println("客户端用户:"+ message);
//6.关闭流、客户端和服务器端
bufferedReader.close();
printWriter.close();
client.close();
server.close();
}
}
TCP文件上传实现
客户端
package com.net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端接收文件
public class FileServer {
public static void main(String[] args) throws Exception {
//1.创建服务
ServerSocket serverSocket = new ServerSocket(8888);
//2.监听客户端连接
Socket socket = serverSocket.accept();
//3.获取输入流
InputStream is = socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!= -1){
fos.write(buffer,0,len);
}
//5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
服务器端
package com.net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端接收文件
public class FileServer {
public static void main(String[] args) throws Exception {
//1.创建服务
ServerSocket serverSocket = new ServerSocket(8888);
//2.监听客户端连接
Socket socket = serverSocket.accept();
//3.获取输入流
InputStream is = socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!= -1){
fos.write(buffer,0,len);
}
//5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
IO流知识巩固
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!= -1){
fos.write(buffer,0,len);
}
----------------------------------------------
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!= -1){
fos.write(buffer,0,len);
}