网络编程
概述
计算机网络
计算器网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协商下,实现资源共享和信息传递功能的计算机系统
网络编程的目的
数据交换,通信
想要达到这个效果需要什么:
-
如何准确地定位网络上的一台主机:IP地址和端口,定位到这个计算机上的某些资源
-
找到了主机。怎么传输数据?
TCP/IP通信
网络通信的要素
如何实现网络的通信?
通信双方的地址:
-
IP
-
端口号
规则:网络通信协议
TCP/IP参考模型:
小结
- 网络编程中有两个主要的问题
- 如何准确的定位到网络上的一台或者多台主机
- 找到主机之后如何进行通信
- 网络编程中的要素
- IP和端口号
- 网络通信协议:UDP,TCP
- 万物皆对象
IP
IP地址:InetAddress
-
唯一的定位一台网络上的计算机
-
127.0.0.1:本机
-
IP地址的分类
-
IP地址分类: IPV4 / IPV6
-
IPV4: 127.0.0.1,四个字节组成,0-255,大概42亿个,30亿都在北美亚洲4亿,2011年用尽
-
IPV6:128位,8个无符号整数
2001:2bb2:0015:2222:000:1aaaa:1312
-
-
公网(互联网) 和 私网(局域网)
- ABCD类地址
- 192.168.xx.xx,专门给组织内部只用的
-
-
域名:记忆IP问题!
- IP:
端口
端口表示计算机上的一个程序的进程
-
不同的进程有不同的端口号!(端口号不能重复,用来区分软件)
-
被规定0-65535
-
TCP,UDP,单个协议下,端口号不能重复
-
端口分类
-
共有端口 0-1023
- HTTP:80
- Https:443
- FTP:21
- Telent:23
-
程序注册端口:1024-49151,分配给用户或者程序
- Tomcat :8080
- MySQL:3360
- Oracle:1521
-
动态端口:49152-65535
netstat -ano #查看所有端口
-
通信协议
协议:约定,就还比我们现在说的是普通话
网络通信协议:速率,传输码率,代码结构,传输控制
TCP/IP协议簇
重要:
- TCP:用户传输协议
- UDP:数据传输报协议
出名的协议:
- TCP:
- IP:网络互连协议
TCP UDP对比
TCP:打电话
-
连接稳定
-
三次握手,四次挥手
三次握手,四次挥手 最少需要三次,保证稳定连接 A:你瞅啥 B:瞅你咋地 A:干一架 A:我要走了 B:你真的要走了吗 B:你真的真的要走了吗 A:我真的要走了
-
客户端,服务端
-
传输完成释放连接,效率低
UDP:发短信
- 不连接,不稳定
- 客户端,服务端:没有明确的解限
- 不管有没有准备好都可以发给你
TCP
客户端:
- 连接服务器
- 发送消息
服务器
- 建立服务的端口 ServerSocket
- 等待用户的连接 accept
- 接受用户的消息
文件上传
- 服务器端
- 客户端
UDP
发送消息
发短信:不用连接,但是要知道对方的地址
发送端
package com.kele.lesson03;
//不需要连接服务器
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpClientDemo01 {
public static void main(String[] args) throws Exception {
//1.建立一个Scoket
DatagramSocket socket = new DatagramSocket();
//2.建个包
String msg = "你好啊,kele";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
//数据,数据的起始位置,要发送的地址和端口号
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//3.发送包
socket.send(packet);
//关闭流
socket.close();
}
}
接收端
package com.kele.lesson03;
//等待客户端的连接
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServerDemo01 {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接受数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);//阻塞接收
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(), 0, packet.getLength()));
//关闭流
socket.close();
}
}
咨询
实现循环发送接受消息
发送方
package com.kele.chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
//准备数据
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
socket.send(packet);
if (data.equals("bye")){
break;
}
}
socket.close();
}
}
接收方
package com.kele.chat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceiveDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);
while (true){
//准备接受包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);
//显示接收的数据
byte[] data = packet.getData();
String receiceData = new String(data, 0, data.length);
System.out.println(receiceData);
if (receiceData.equals("bye")){
break;
}
}
socket.close();
}
}
在线咨询
实现双方都可以发送和接收
代码在F:\code\java_code\NET\study\src\com\kele\chat这里
URL
概念
统一资源定位符:定位资源的,定位互联网上的某一个资源
可以定义一个类去下载网络上的资源:
package com.kele.lesson04;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class UrlDown {
public static void main(String[] args) throws Exception {
//下载地址
URL url = new URL("http://localhost:8080/kele/jimiwenjian.txt");
//2.连接到这个资源
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("jimiwenjian.txt");
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1){
fos.write(buffer, 0, len);//写出这份数据
}
fos.close();
inputStream.close();
urlConnection.disconnect();
}
}