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