网络编程
1.1 概述
地球村:你在北京,你的一个巴铁朋友给你写信!
-
信件
-
计算机网络:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
-
网络编程的目的:
传播交流信息,数据交换———> 通信
-
想要达到这个效果需要做什么:
- 如何准确地定位网络上的一台主机 192.168.1.148:端口号,定位到这个计算机上的某个资源
- 找到了这个主机,如何进行数据传输呢?
javaweb: 网页编程 B/S;
网络编程:TCP/IP C/S;
1.2 网络通信的要素
如何实现网络通信?
通信双方地址:
-
IP
-
端口号
规则:网络通信的协议
TCP/IP 参考模型:
1.3 IP网址
IP地址:InetAdress
- 唯一定位一台网络上的计算机
- 127.0.0.1:本机 localhost
- IP的分类
- IPV4/IPV6
- **IPV4:**127.0.0.1 ,4个字节组成(42亿)。
- IPV6: fe80::44e6:1b0d:6a0a:3554%13 ,128位。8个无符号整数!
- 公网(互联网)-私网(局域网)
- ABCD类地址
- 192.168.xx.xx,专门给组织内部使用
- IPV4/IPV6
//测试IP
public class TestIntAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);
InetAddress inetAddress3 = InetAddress.getByName("localhost");
System.out.println(inetAddress3);
//查询网站IP地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress2);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
1.4 端口 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
-
动态,私有:49151~65535
netstat -ano #查看所有的端口 netstat -ano|findstr "5900" #查看指定的端口 tasklist|findstr "8696" #查看指定端口的进程
-
1.5 通信协议
**协议:**约定,就好比我们说的普通话。
**网络通信协议:**速率,传输码率,代码结构,传输控制····
**问题:**非常的复杂!!!
大事化小---->分层!
TCP/IP协议簇:实际上是一组协议
重要:
- TCP:用户传输协议
- UDP:用户数据报协议
二者的区别:
-
TCP(打电话)
-
连接,稳定
-
三次握手,四次挥手
三次握手(交流三次) A:你瞅啥? B: 瞅你咋滴? A: 干一场! 四次挥手(响应四次) A: 我要走了! B: 你要离开我了吗? B: 你真的要离开我了吗? A: 是的,我要离开你。
-
客户端,服务端
-
传输完成,释放连接,效率低
-
-
UDP(发短信)
- 不连接,不稳定
- 客户端服务端没有明确的界限
- 不管有没有准备好,都可以发送
- DDOS:洪水攻击(饱和攻击)!
1.6 TCP
客户端:
- 创建客户端
- 发送消息到服务器
public class TcpClient {
public static void main(String[] args) {
//创建客户端,连接服务端,ip+端口
//127.0.0.1 或者 localhost 表示本机地址
try(Socket socket = new Socket("127.0.0.1", 6666)){
//发送消息到服务端
OutputStream outputStream = socket.getOutputStream();
String s = "你好啊";
outputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端:
- 创建服务端
- 等待接入客户端
- 接受客户端发送的消息
public class TcpServer {
public static void main(String[] args) {
//创建服务端 port端口-每个程序在一台计算机上的唯一标识
try(ServerSocket serverSocket = new ServerSocket(6666)) {
System.out.println("服务端完成创建....");
//等待客户端接入,接入前一直阻塞,直到有客户端接入
//返回接入的客户端
Socket socket = serverSocket.accept();
System.out.println("有客户端接入...");
//接收客户端发送的消息
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String s = new String(bytes, 0, len);
System.out.println("客户端发送的消息:" + s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.7 Tomcat
服务端:
- 自定义 S
- Tomcat 服务器 S:Java后台开发
客户端:
- 自定义 C
- 浏览器 B
1.8 UDP
/**
* UDP-服务端
* 单向通信
*/
public class UpdServer {
public static void main(String[] args) {
DatagramSocket server = null;
try {
//创建服务端,绑定一个端口
server = new DatagramSocket(7777);
System.out.println("服务端创建完成...");
//接收数据的数据包
byte[] bytes = new byte[1024];
DatagramPacket receiveData = new DatagramPacket(bytes, bytes.length);
//接收客户端的消息
server.receive(receiveData);
//解析接收到的数据
byte[] data = receiveData.getData(); //获取接收到的数据
int length = receiveData.getLength();//实际的数据长度
String s = new String(bytes, 0, length);
System.out.println("客户端发送的消息:" + s);
} catch (IOException e) {
e.printStackTrace();
} finally {
assert server != null;
server.close();
}
}
}
/**
* UDP-客户端
* 单向通信
*/
public class UdpClient {
public static void main(String[] args) {
DatagramSocket client = null;
try {
//创建端点DatagramSocket
client = new DatagramSocket();
//发送的数据
String s = "你好啊,我是UDP客户端";
byte[] bytes = s.getBytes();
//发送的地址
InetAddress address = InetAddress.getByName("127.0.0.1");
//发送的数据包
DatagramPacket sendData = new DatagramPacket(bytes, bytes.length, address, 7777);
//发送消息到服务端
client.send(sendData);
System.out.println("发送消息到服务端...");
} catch (IOException e) {
e.printStackTrace();
} finally {
assert client != null;
client.close();
}
}
}