网络编程
一.计算机网络与网络编程概述
1.计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2.网络编程
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换
二.网络模型
1.概述
计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型
2.俩种参考模型
OSI参考模型 | TCP/IP参考模型 |
---|---|
应用层 | 应用层 |
表示层 | 应用层 |
会话层 | 应用层 |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 网络接口层 |
物理层 | 网络接口层 |
IP的由来:我们计算机识别的是二进制
IP用四个字节来表示
三.网络编程的三要素
1.IP地址(InetAddress)
(1)概述
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。它是网络中设备的标识,不易记忆,可用主机名,可以确定某个计算机
(2)IP地址的组成
IP地址 = 网络地址+主机地址
A类IP地址
第一段号码为网络地址,剩下的三段号码为本地计算机的号码
B类IP地址
前二段号码为网络地址,剩下的二段号码为本地计算机的号码
C类IP地址
前三段号码为网络地址,剩下的一段号码为本地计算机的号码
(3)IP地址的分类
A类:1.0.0.1—127.255.255.254
10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1—191.255.255.254
172.16.0.0—172.31.255.255是私有地址。
C类 192.0.0.1—223.255.255.254
192.168.X.X是私有地址
D类 224.0.0.1—239.255.255.254
E类 240.0.0.1—247.255.255.254
特殊地址
127.0.0.1 回环地址,可用于测试本机的网络是否有问题.
测试方式:DOS命令窗口输入 ping 127.0.0.1
在DOS命令窗口输入 ipconfig可以查看本机IP地址
xxx.xxx.xxx.255 为广播地址
IPv4=网络号段+主机号段
(4)InetAddress类
java中可以使用InetAddress类对IP地址进行获取和操作,此类表示互联网协议 (IP) 地址。
InetAddress类的常见功能
俩种获取InetAddress对象的方法
InetAddress address = InetAddress.getByName("这里写主机名");
InetAddress localHost = InetAddress.getLocalHost();//通过getLocalHost() 获取InetAddress对象,可以自动获取主机名
public static InetAddress getByName(String host)
String ip = address.getHostAddress();//获取IP
String hostName = address.getHostName();//获取主机名
2.端口
(1)概述
端口分为物理端口、网卡口和逻辑端口,我们这里指的就是逻辑端口
:每个网络程序都会有一个逻辑端口
用于标识进程的逻辑地址,不同进程的标识
确定一个应用
有效端口:
0-65535(两个字节),其中0~1023系统使用或保留端口。
3.协议
通讯的规则常见协议:TCP,UDP
(1)UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报的大小在限制在64k;
缺点:是不可靠的协议;
优点:速度快
(2)TCP
建立连接,形成传输数据的通道;
在连接中进行大数据量传输;
优点:因为需要连接所以是可靠协议;
缺点:因为必须建立连接,所以效率会稍低
四.Socket(套接字=IP+端口)
1.概述
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
2.原理机制
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输
五.UDP协议
1.概述
UDP协议属于不可靠协议发送数据大小有限制
java针对UDP协议提供了一个socket
DatagramSocket:发送和接收数据报包的套接字
2.UDP协议发送和接收数据
步骤代码演示:
客户端:
//1.创建客户端的Socket
DatagramSocket ds = new DatagramSocket()
//2.发送
//方法1.发送规定数据
byte[] bytes = "UPD你好".getBytes();
//方法2.循环发送键盘录入数据
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("请输入你要发送的数据");
String s = reader.readLine();
if (s.equals("886")) {
break;
}
byte[] bytes = s.getBytes();
//以下方式相同
InetAddress byName = InetAddress.getByName(InetAddress.getLocalHost().getHostAddress());
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, 6666);//数据报包,不对包的传递做出保证
ds.send(datagramPacket);
//3.释放资源
ds.close();
服务端:
//1.创建服务端Socket 并向外暴露端口
DatagramSocket ds = new DatagramSocket(6666);
System.out.println("服务端已经开启....");
//选择发送键盘录入方式的数据在此加入一个while循环包括之后所有代码,并去掉释放资源
//2.创建一个数据报包
byte[] bytes = new byte[1024];
//3.构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//4.接收数据
ds.receive(datagramPacket);//阻塞式方法,等待接收客户端发来的数报包
//5.从数据报包里面取出数据
//方法1
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();//取出数据的实际长度
String s = new String(data, 0, length);
System.out.println(s);
//方法2
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
String ip = datagramPacket.getAddress().getHostAddress();//取出发送者ip
System.out.println(ip+"给你发来:"+new String(data,0,length));
//6.释放资源
ds.close();
六.TCP协议
1.概述
两端必须建立连接,属于可靠协议,发送数据大小无限制,效率低一些
java针对TCP协议提供了相应的Socket
服务端Socket ServerSocket
客户端套接字 Socket
2.TCP协议发送和接收数据
步骤代码演示:
客户端:
//1.创建客户端的Socket
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 6666);//参1.服务器的IP 参2.服务端 端口
//2.发送数据,获取通道中的流
OutputStream out = socket.getOutputStream();
out.write("你好TCP!".getBytes());
//3.读取服务端的反馈
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int len= in.read(bytes); //阻塞方法
System.out.println(new String(bytes, 0, len));
//4.释放资源
socket.close();
服务器:
//ServerSocket( int port)
//1.创建绑定到特定端口的服务器套接字。
ServerSocket ss = new ServerSocket(6666);//暴露端口号
//2.侦听 客户端的连接
System.out.println("服务器已经开启,等待连接...");
Socket sk = ss.accept();//侦听并接受到此套接字的连接。
//此方法在连接传入之前一直阻塞,等待客户端的连接,一旦有客户端连接上来,就返回该套接字
//3.读取客户端数据
InputStream in = sk.getInputStream(); //获取通道中的输入流
byte[] bytes = new byte[1024];
int len = in.read(bytes);//阻塞方法
String ip = sk.getInetAddress().getHostAddress();//获取客户端的ip
System.out.println(ip+"-发来一条消息:"+new String(bytes, 0, len));
//4.给客户端一个反馈
OutputStream out = sk.getOutputStream();
out.write("客户端你好,我已经收到你的消息".getBytes());
//5.释放资源
ss.close();
七.下载网络资源
URL:统一资源定位符
协议 IP:端口号 资源路径
代码如下:
public static void main(String[] args) throws IOException {
//1.获取网址
String imgUrl="http://www.westos.org/wp-content/uploads/2017/10/5D5DD3783D9955F5472C0B84F1BD14E5_21.jpg";
imgUrl="http://img.redocn.com/sheji/20141219/zhongguofengdaodeliyizhanbanzhijing_3744115.jpg";
//2.Java 提供了一个类,用来封装 URL
URL url = new URL(imgUrl);
//3.打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//4.设置一些参数
conn.setRequestMethod("GET");//设置请求方式默认是 GET
conn.setConnectTimeout(3000);//设置请求超时
// conn.setRequestProperty("",""); //设置请求头
int code = conn.getResponseCode(); //获取相应状态码,200代表成功响应
String msg = conn.getResponseMessage();//获取相应消息
int length = conn.getContentLength();//获取网络资源文件的大小
System.out.println(code);
System.out.println(msg);
System.out.println(length);
if(code==200){
//5.获取输入流,读取服务器响应 的字节数据
InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream("图片.jpg");
int len=0;
byte[] bytes=new byte[1024];
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
System.out.println("下载成功");
}
}