二十二章 – 网络编程
一、理解网络的相关概念
1.网络的概念
计算机网络:
多个计算机之间通过专业的设备进行连接,形成一个网络 ,每一台计算机都是一个节点 可以进行信息的传递。
2.网络的分类
局域网 LAN
城域网 MAN
广域网 WAN
互联网
无线网
3.网络通信-IP
在网络中,每台计算机都要遵守IP协议产生一个唯一的上网标识
IP(internet Protocol)
IPV4: 由四个八位二进制组成 11001100.11001100.11001100.11001100.
由于不方便记忆 转换为十进制表示,最大的范围为0-255。
IPV6:基本上可以满足全世界的地址需求
查看本机的IP地址: ipconfig
测试网络连通: ping 要连接的IP地址
域名: www.baidu.com
DNS(Domain Name System)域名系统
会在系统内准备一份域名和对应机器IP的映射表
访问一个域名时:
1.查找浏览器内是否有缓存映射
2.查找本机hosts文件
3.前往网络服务商提供的域名系统
特殊的IP 127.2.0.1 == localhost 本机的 可以表示本机
4.网络通信-端口
每个程序运行时都会占用一个端口 他是唯一的 端口范围:0-65535
如果想通过某个程序在网络内进行信息交流 必须要知道对方的IP和程序端口号
IP端口号
例如:
127.0.0.1:8080
61.135.169.124:80(HTTP协议默认端口是80)
5.传输协议
网络模型中传输层的协议 TCP UDP
二、使用Socket实现
1.应用程序的架构
B/S(Browser浏览器/sever 服务器)
基于浏览器为客户端的网络应用程序
典型:网站、小程序
优点:
1.无需下载安装 只要有浏览器就可以访问【可以留住很多用户】
2.服务器更新,用户几乎无感知,刷新浏览器就可以得到最新的内容
3.因为只需要有浏览器,所以在平台层面的兼容性可以忽略
缺点:
1.因为所有的资源都在服务器上 所以在传输信息过程中受到带宽影响比较大
2.在画面渲染和安全验证方面受限严重
3.因为资源请求是同步请求,所以用户体验差 由谷歌地图带起AJAX风之后 有所改善
C/S(Client客户端/Sever)
基于自身定制的客户端的网络应用
典型: QQ 微信 APP
优点:
1.因为大多数普通资源都放在了客户端,所以在传输信息时只需要加载一些重要信息即可 受到带宽影响较小
2.在画面渲染和安全验证方面,比较强,实现也比较容易
3。因为信息加载只需要加载必要信息,所以体验较好
缺点:
1.必须安装客户端才能使用
2.如果服务器更新 鼻祖要重新下载客户端(省流/补丁更新)
3.不同的平台必须适配不同的版本
Socket介绍
插座,通信连路点
2.传输协议
网络模型中传输层的协议。TCP UDP
TCP:传输控制协议
三次握手 面向连接的传输协议 适用于传输重要的 对安全要求比较高的信息 下载文件 聊天、传输资料
为了维护连接可靠 效率较低
UDP:用户数据报协议
面向无连接的传输 协议 适用于传输一些不太重要的信息 视频聊天、看视频
效率较高
3.基于TCP
package tcp.demo4;
/*
*服务器
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
// 1.创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(7777);
// 2.监听客户端
Socket clientSocket = serverSocket.accept();
// 3.打开输入流
InputStream is = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer)) != -1) {
String str = new String(buffer, 0, len);
System.out.println(str);
}
// 4.发送响应
clientSocket.shutdownInput();
// 打开输出流
OutputStream os = clientSocket.getOutputStream();
os.write("已接收到哦!".getBytes());
// 5. 释放资源
if(os != null) {
os.close();
}
if(is != null) {
is.close();
}
if(clientSocket != null) {
clientSocket.close();
}
if(serverSocket != null) {
serverSocket.close();
}
}
}
package tcp.demo4;
/*
*客户端
*/
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = null;
OutputStream os = null;
try {
// 1.创建Socket对象
socket = new Socket("localhost",7777);
// 2.打开输出流
os = socket.getOutputStream();
os.write("姑娘别回头!".getBytes());
// 3.接收响应
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os != null) {
os.close();
}
if(socket != null) {
socket.close();
}
}
}
}
4.基于UDP
package UDP.demo6;
/**
* 服务器
*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
byte[] buffer = new byte[1024];
// 1.指定数据包 用来存储客户请求的信息
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
// 2.接收客户信息
ds = new DatagramSocket(7777);
ds.receive(dp);
// 3.解包
byte[] data = dp.getData();
String str = new String(data);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}finally {
// 4.释放资源
if(ds != null) {
ds.close();
}
}
}
}
package UDP.demo6;
/**
* 客户端
*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws Exception {
// 1.创建 DatagramPacket 对象 封装服务端的地址和传输的信息
String str= "我是客户端!";
// 将字符串转换为字节数组
byte[] bytes = str.getBytes();
InetAddress inetAddress = InetAddress.getByName("localhost");
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,inetAddress,7777);
// 2.发送数据报
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
if(ds != null) {
ds.close();
}
}
}